sizeof(Book); 会是多少?
有没有算出来.
其实类和我们结构体一样是有大小的, 而且类的内存对齐方式和结构体一样.
为什么要内存对齐?
这个要说到操作系统上了, 我们的 cpu 把内存当成是一块一块的, 块的大小可以是 2,4,8,16 个字节, 因此 CPU 在读取内存的时候是一块一块进行读取的, 块的大小称为 (memory granularity) 内存读取粒度.
为什么要分块呢?(分块读取有利于提高内存访问效率)
和内存对齐有什么关系?
假设 CPU 要读取一个 4 字节大小的数据到寄存器中(假设内存读取粒度是 4), 分两种情况讨论:
1. 数据从 0 字节开始
2. 数据从 1 字节开始
解析: 当数据从 0 字节开始的时候, 直接将 0-3 四个字节完全读取到寄存器, 结算完成了. 当数据从 1 字节开始的时候, 问题很复杂, 首先先将前 4 个字节读到寄存器, 并再次读取 4-7 字节的数据进寄存器, 接着把 0 字节, 4,6,7 字节的数据剔除, 最后合并 1,2,3,4 字节的数据进寄存器, 对一个内存未对齐的寄存器进行了这么多额外操作, 大大降低了 CPU 的性能.
所以内存对齐就很好的提高了 cpu 的读取效率.
内存对齐的计算?
1. 第一个成员在与结构体变量偏移量为 0 的地址处.
2. 其他成员变量要对齐到某个数字 (对齐数) 的整数倍的地址处.
对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值.
VS 中默认的值为 8
gcc 中的默认值为 4
3. 结构体总大小为最大对齐数 (每个成员变量除了第一个成员都有一个对齐数) 的整数倍.
4. 如果嵌套了结构体的情况, 嵌套的结构体对齐到自己的最大对齐数的整数倍处, 结构体的整体大小就是所有最大对齐数 (含嵌套结构体的对齐数) 的整数倍.
空类的计算
先说答案: 空类的大小是 1
来源: http://geek.csdn.net/news/detail/258431