使用靜態數組建立類

來源:互聯網
上載者:User

問題是這樣的:實現架構中類的RTTI需要儲存類資訊,為每一個要加入到運行時識別的類架構中的類,

都建立一個儲存類資訊的classInfo類對象,記憶體使用量的是待用資料區的類中靜態數組。

靜態數組的大小是:

U32 _className::s_classInfoBuf[(sizeof(ClassInfo) + sizeof(U32) - 1) / sizeof(U32)];
 new (s_classInfoBuf) ClassInfo();

 

這個數組的大小 = (sizeof(ClassInfo) + sizeof(U32) - 1) / sizeof(U32) 著實讓我看了很久沒有弄明白。

類的大小到底怎麼計算的:sizeof(ClassInfo)不能夠計算類的大小嗎?這裡有什麼懸疑呢?

為何不直接  s_classInfoBuf [sizeof(ClassInfo) / sizeof(U32)]?

(類中的靜態成員:在聲明中時,也都是聲明而不是定義,類靜態成員都是必須在類外進行定義的。)


1避免為0:一個空類的大小為1,sizeof(ClassInfo) = 1 而sizeof(U32) = 4 ,1/4 = 0;

長度為0,No!其實這樣直接使用U8就可以了……

2保證四位元組對齊:A = (sizeof(VfxClassInfo) + sizeof(VfxU32) - 1) / sizeof(VfxU32)

  的結果一定是4的倍數,且A*4 > = sizeof(ClassInfo)。如果sizeof(ClassInfo)長度為17,

  則數組長度為:(17 + 4 - 1)/ 4 = 5 實際數組大小:sizeof(U32)* 5 = 20。

  保證靜態數組的長度是4的倍數,且能足夠滿足建立ClassInfo需要的記憶體大小。

  那麼sizeof()計算的類大小不會保證一定是4位元組對齊,按道理說這個是編譯器會自動完成相應的位元組對齊計算的,

  在建立對象的時候也會根據指定位元組對齊。Sizeof()計算大小和new建立對象都會使用相同位元組對齊。

  所以這裡並沒有實際的意義;可能就像我們系統工程師所說:以防萬一!

  (為何要位元組對齊:http://www.ibm.com/developerworks/library/pa-dalign/)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.