类成员函数大小问题
?上周,我一同事,在調試我們項目的時候,發現我寫的一段代碼中,有一個類成員函數指針數組有大小有點怪異,便叫我過去瞧瞧。有如下一段定義:
?
interface IPLUnknown
{
? virtual ~IPLUnknown() {}
};
?
interface IPLRunnable : public IPLUnknown
{
? virtual BOOL? Init(void) = 0;
? ……
};
?
class CThread;
typedef void (CThread:: *CALLBACK)(const SMsg * const pMsg);
?
class CThread : public IPLRunnable
? ,public TPLSingleton<CThread>
{
? ……
? CALLBACK?????????? m_mapHandler[MAX_MAP];
? ……
};
其中,IPLRunnable 是一個純虛類,MAX_MAP為11,但是在調試的時候,卻在Visual C++中看到m_mapHandler的數組個數為22,而sizeof(m_mapHandler[0])為4,sizeof(m_mapHandler)為88,我的那位同事感覺很奇怪。在32位機上,sizeof(m_mapHandler[0])為4是可以理解,但為什么是分配的是22個數組大小,總和為88字節的空間。根據我的經驗,我沒有理會VC調試器給我們的信息,而是在代碼中添加了一些打印輸出語句;經過打印輸出顯示,sizeof(m_mapHandler[0])為8,而不是VC調試器中所顯示的4;因此,數組總大小為88個字節,是正確的,只是調試器顯示錯誤罷了。現在問題的焦點轉向了什么sizeof(m_mapHandler[0])為8,而不是4?經過測試,我們發現,如果將public IPLRunnable注釋掉,則sizeof(m_mapHandler[0])為4,原來是純虛基類所致。后來我們還將public IPLRunnable改為virtual public IPLRunnable測試sizeof(m_mapHandler[0])則為12,這個比較特別,根據編譯器的不同也有所不同。為證實是因編譯器而異, 我分別在LINUX下用GCC編譯輸出,以及在WINDOWS下用MINGW下的GCC編譯輸出,sizeof(m_mapHandler[0])均為8。值得一提的是,在用GCC編譯的程序中,不管是public IPLRunnable還是virtual public IPLRunnable,sizeof(m_mapHandler[0])均為8。
?
總結:
??? 在VC中,類成員函數指針隨基類不同而不同,如果派生類是普通派生于基類,且基類有純虛函數,則單個指針大小為8字節(32位下);如果基類有純虛函數,且在派生時,加了virtual關鍵字,則單個指針大小為12個字節;否則單個指針大小為4字節。
??? 在GCC中,類成員函數指針不隨基類的變化而變化,單個指針大小均為8個字節。
?
?
轉載于:https://www.cnblogs.com/witton/archive/2009/11/15/6868988.html
總結
- 上一篇: 为了评职称怎么才能上到公开课
- 下一篇: SQL试题集(二)