在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的計算花費要比它們少。而書上好像沒有對這個問題作出解釋。我不知道是什么地方理解錯誤了,所以先懸著,等找到答案再把它寫完。或者如有看到此文而不吝賜教的,不勝感激!

