设为首页 加入收藏

TOP

C++中数据对齐问题
2014-04-06 17:35:47 来源: 作者: 【 】 浏览:108
Tags:数据 问题

  首先是struct,在C++中,结构体其实和class有很大的相似了。但是有一点不同的是,struct默认是public,而class中是private.

  当然,struct继承等用法也是可以的。

  共用体的声明方式是:

  枚举的声明方式与共用体比较相似

  其中a初始化为0,后面默认增1,若已经初始化,则后面再增1,比如d=6在这里。

  struct长度计算

  大家猜一下,s1 x;int b=sizeof(x);

  他的结果会是多少呢?有人会觉得应该是1+8+4+1=14.

  实际上是24.为什么会是这样呢?这个和结构体的对齐方式有很大关系。总之有两条

  1、整体空间是最大成员占用字节的整数倍,比如这里最大字节占用的是double,他为8,那肯定是8,16,24…

  2、内存按照结构体中的数据成员先后排序,并且当前地址应该是以当前成员所占用空间的整数倍。比如在这里double b占用的是8个字节,那么以摆字节就应该是8,16,24.而char a,只有一个字节,则前面空间自动补齐。

  按照上面两点的规则,我们不难得出8+8+4+1,但是应该是8的整数倍,所以是24.

  这里有必要补充一下:在Linux+gcc环境下,若最大成员是4,则整体空间只需是4的倍数即可。所以这里只需要是4的倍数,4,8,12,16,20,24

  第二点,在Linux+gcc环境下,若某成员类型所占字节数超过4,那前面已摆放空间只需要是4的倍数即可。这里double b;前面只需补齐4个即可,而不需补齐8个。

  故会出现整体空间是20的情况。4+8+4+1=17.但是应该是4的倍数,则为20.

  那么联合体应该是怎么样的呢?

  很显然联合体取值的时候只能取其中的一个,那么,联合体就是多个成员公用一个内存空间。大家很自然的就想到了,最大那个成员所占用的空间就是联合体的空间了。

  讲到了数据的对齐方式,那我们就非常有必要讲一下两种不同机器的存储方式:大端存储模式和小端存储模式。

  大端存储模式:高位字节存储低地位内存中,低位字节存储高位。这里均以0x12345678为例。

  小端存储模式:低位存储在高位内存中

  在小端系统中,b的ASCII为多少?

  1 union enumName {

  2     int i;

  3     unsigned char ch ;

  4 };

  5 int _tmain(int argc, _TCHAR* argv[])

  6 {

  7     enumName student;

  8        student.i=0x1420;

  9     char b=student.ch[0];

  10 }

  答案应该是32

  小端是低位放低位,高位放高位。则是20   14这样排放。ch[0]等于0x20.

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++中类的特殊数据成员的构造 下一篇char *p 与char p..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·在 Redis 中如何查看 (2025-12-26 03:19:03)
·Redis在实际应用中, (2025-12-26 03:19:01)
·Redis配置中`require (2025-12-26 03:18:58)
·Asus Armoury Crate (2025-12-26 02:52:33)
·WindowsFX (LinuxFX) (2025-12-26 02:52:30)