問題是這樣的:實現架構中類的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/)