問題是這樣的:實現框架中類的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建立物件都會使用相同位元組對齊方式。
所以這裡並沒有實際的意義;可能就像我們系統工程師所說:以防萬一!
(為何要位元組對齊:
使用靜態陣列建立類
問題是這樣的 實現框架中類的rtti需要儲存類資訊,為每乙個要加入到執行時識別的類框架中的類,都建立乙個儲存類資訊的classinfo類物件,記憶體使用的是靜態資料區的類中靜態陣列。靜態陣列的大小是 u32 classname s classinfobuf sizeof classinfo size...
資料結構中的陣列 靜態陣列類的建立
1,順序儲存線性表兩個問題 1,當做陣列誤用 2,效率有隱患 2,本文解決第乙個功能上的問題,建立乙個陣列類代替順序儲存結構中的陣列訪問操作符 1,完成 array 類的具體實現 2,完成 staticarray 類的具體實現,替代原生陣列 4,需求分析 1,建立陣列類代替原生陣列的使用 1,陣列類...
C Array類 建立陣列
除了使用c 語法 建立陣列之外,還可以使用靜態方法 createinstance 建立陣列。舉個例子 array intarray1 array.createinstance typeof int 5 for int i 0 i 5 i for int i 0 i 5 i 在這個例子中,演示了如何建...