sizeof

sizeof返回对象或类型名的长度,返回值类型为size_t,长度的单位是字节。

sizeof操作符在编译时已经得到了结果,即sizeof表达式的结果是编译时常量,字节对齐是编译时决定的。

                          

      32位机        64位机     
         bool                1 byte     1 byte  
         char     1 byte     1 byte
         short      2 byte      2 byte
          int      4 byte      4 byte
          long(全字长)      4 byte      8 byte
          指针(全字长)      4 byte      8 byte
         float      4 byte      4 byte
        double      8 byte      8 byte
        string      32       32

   字长:指明整数和指针数据的标称大小。

sizeof 计算栈中分配的大小,对于静态变量和全局变量都是存放在全局数据区的,不做计算。

1) 对函数使用sizeof,在编译阶段会被函数返回值的类型取代。

2) 空类的sizeof是1(因为我们声明该类型的实例的时候,它必须在内存中占有一定的空间);

      类中只有构造函数和析构函数,对类求sizeof还是1(调用构造函数和析构函数只需知道函数的地址即可,而这些函数地址只与类型相关,而与类型的实例无关);

      类中有若干虚函数,则类的sizeof是4或者8,此值是指针的sizeof 大小(因为有虚函数,就会为该类型生成虚函数表,并在该类型的每一个实例中添加一个指向虚函数表的指针);

3) 任何情况下,数组作为函数的参数,都退化为指针。

4)空类的sizeof为1,单一继承的空类的sizeof也是1,多重继承的空类空间还是1;

     虚继承涉及虚表(虚指针),它的sizeof是4;

5)关于数据对齐:

     当结构体内的元素的长度都小于处理器的位数的时候,便以结构体里面最长的数据元素为对齐单位,则结构体的sizeof一定是最长的数据元素的整数倍;

     如果结构体里存在长度大于处理器位数的元素,就以处理器的位数为对齐单位;

     但是结构体内类型相同的连续元素将在连续的空间内(有时候不一定类型相同也可以在连续空间)。

     #pragma  pack(4),则强制以32位为单位对齐。

6)结构体内的静态变量static是存放在全局数据区的,而sizeof计算栈中分配的大小,不会计算在内。

7)  对数组做sizeof操作等效于将对其元素类型做sizeof操作的结果乘上数组元素的个数。

    

原文地址:https://www.cnblogs.com/Xylophone/p/3783467.html