使用静态数组创建类
问题是这样的:实现框架中类的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/)