使用静态数组创建类

问题是这样的:实现框架中类的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/

原文地址:https://www.cnblogs.com/bastard/p/2311197.html