zoukankan      html  css  js  c++  java
  • 使用静态数组创建类

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

  • 相关阅读:
    正态分布与中心极限定理
    超几何分布与二项分布及其期望
    cf492E. Vanya and Field(扩展欧几里得)
    ZR#317.【18 提高 2】A(计算几何 二分)
    小米OJ刷题日志
    cf519D. A and B and Interesting Substrings(前缀和)
    cf519C. A and B and Team Training(找规律)
    BZOJ2118: 墨墨的等式(最短路 数论)
    Service生命周期图
    python2.7中使用mysql (windows XP)
  • 原文地址:https://www.cnblogs.com/bastard/p/2311197.html
Copyright © 2011-2022 走看看