日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

类成员函数大小问题

發布時間:2025/5/22 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 类成员函数大小问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?上周,我一同事,在調試我們項目的時候,發現我寫的一段代碼中,有一個類成員函數指針數組有大小有點怪異,便叫我過去瞧瞧。有如下一段定義:

?

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

總結

以上是生活随笔為你收集整理的类成员函数大小问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。