LINGSUIYU'S BLOG

C++博客 联系 聚合 管理
  2 Posts :: 0 Stories :: 10 Comments :: 0 Trackbacks

        在Efficient C++的第二章,讲述了关于继承和构造(析构)函数造成的计算开销,仍然有些糊涂。对与以下三段关于互斥锁使用的代码(来自Efficient c++):

// Version 1
int main()
{
    
    
// Start timing here
    for(i=0; i<1000000; i++)
    
{
        pthread_mutex_lock(
&mutex);
        shareCounter
++;
        pthread_mutex_unlock(
&mutex);
    }

    
// Stop timing here
    
}

 

// Version 2
int main()
{
    
    
// Start timing here
    for(i=0; i<1000000; i++)
    
{
        SimpleMutex m(mutex);
        sharedCounter
++;
    }

    
// Stop timing here
    
}


class SimpleMutex
{
public:
    SimpleMutex(pthread_mutex_t 
& lock):myLock(lock){acquire();}
    
~SimpleMutex{release();}

private:
    
int acquire(){return pthread_mutex_lock(&myLock);}
    
int release(){return pthread_mutex_unlock(&myLock);}
    pthread_mutex_t 
& myLock;
}
;

// Version 3
int main()
{
    
    
// Start timing here
    for(i=0; i<1000000; i++)
    
{
        DerivedMutex m(mutex);
        sharedCounter
++;
    }

    
// Stop timing here
    
}


class BaseMutex
{
public:
    BaseMutex(pthread_mutex_t 
& lock){};
    Virtual 
~BaseMutex(){};
}
;

class DerivedMutex:public BaseMutex
{
public:
    DerivedMutex(pthread_mutex_t 
&lock):BaseMutex(lock),myLock(lock){acquire();}
    
~DerivedMutex(){release();}

private:
    
int acquire(){return pthread_mutex_lock(&myLock);}
    
int release(){return pthread_mutex_unlock(&myLock);}
    pthread_mutex_t 
& myLock;
}
;

书中测得的结果是Version 1和 Version 2 耗时相同,为1.01s,而Version 3 耗时1.63秒,这说明前两个版本计算开销相同而第三个版本计算开销明显增加。
        而书中也说了Version 2 的构造函数中,初始化myLock成员是计算损失,当acquire()内联不成功的时候,调用acquire()也是计算损失。
        再看Version 3,它首先调用基类的构造函数,由于是内联的,而且函数体为空,其开销应该忽略不计,然后是初始化myLock,调用acquire(),这些都跟Version 2中一样。
        这样看起来反倒是Version 2 和  Version 3 的计算花费应该相同了,而Version 1的计算花费要比它们少。而书上好像没有对这个问题作出解释。我不知道是什么地方理解错误了,所以先悬着,等找到答案再把它写完。或者如有看到此文而不吝赐教的,不胜感激!
posted on 2008-08-21 10:09 零碎雨 阅读(632) 评论(3)  编辑 收藏 引用

Feedback

# re: 关于c++继承带来的开销的疑惑 2008-08-22 00:38 theanswerzju
基类的构造函数明显不是空的呀 有虚析构函数的 至少还得在构造函数中设置vtable,vptr的呀  回复  更多评论
  

# re: 关于c++继承带来的开销的疑惑 2008-08-22 08:58 零碎雨
@theanswerzju
哦,是的,刚刚学到vtable和vptr,对c++类的内部实现还不是很了解,谢谢您的指出!我仍然有一个疑问,觉得至少Version 2 会比Version 1开销大一点,因为多了初始化myLock成员,但书上说两者是一样的,是不是这个开销不大可以忽略?  回复  更多评论
  

# re: 关于c++继承带来的开销的疑惑 2008-08-22 17:00 theanswerzju
@零碎雨
你可以对比一下两者的汇编结果
记得把inline设为允许,VC默认Debug下是关掉的
  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理