设为首页 加入收藏

TOP

C++sizeof使用规则及陷阱分析(3)
2014-11-23 21:32:08 】 浏览:9157
Tags:sizeof 使用 规则 陷阱 分析

  四、复杂数据类型中sizeof及其数据对齐问题


  (1)、union的sizeof问题与cpu的对界


  考虑下面问题:(默认对齐方式)


  1 union u //8对齐


  2 {


  3 double a;


  4 int b;


  5 };


  6


  7 union u2 //4对齐


  8 {


  9 char a[13];


  10 int b;


  11 };


  12


  13 union u3 //1对齐


  14 {


  15 char a[13];


  16 char b;


  17 };


  18


  19 cout<


  20 cout<


  21 cout<


  22


  都知道union的大小取决于它所有的成员中,占用空间最大的一个成员的大小。所以对于u来说,大小就是最大的double类型成员a了,所以sizeof(u)=sizeof(double)=8。但是对于u2和u3,最大的空间都是char[13]类型的数组,为什么u3的大小是13,而u2是16呢?关键在于u2中的成员int b。由于int类型成员的存在,使u2的对齐方式变成4(4字节对齐),也就是说,u2的大小必须在4的对界上,所以占用的空间变成了16(最接近13的对界)。


  结论:复合数据类型,如union,struct,class的对齐方式为成员中对齐方式最大的成员的对齐方式。


  编译器对界:


  首先解释下CPU对界问题,32的C++采用8位对界来提高运行速度,所以编译器会尽量把数据放在它的对界上以提高内存命中率。


  通过程序可以改变编译器对界,使用#pragma pack(x)宏可以改变编译器的对界方式,默认是8。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C趣味程序(二)(11)完全数 下一篇C++sizeof使用规则及陷阱分析(2)

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目