免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: pan_0326
打印 上一主题 下一主题

C/C++中数据对齐的缺陷 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2010-08-25 23:44 |只看该作者
回复 10# yulihua49


sizeof(CB)==12, sizeof1(CB)==9
构造数组时当然用sizeof了,构造新结构才用sizeof1

论坛徽章:
0
12 [报告]
发表于 2010-08-26 08:32 |只看该作者
有些对齐是体系结构的要求,现在的编译器对齐一面是为了支持不同的体系结构,另一方面是为了提高访存的效率。
程序员可以通过安排结构体成员的顺序来减少填充的字节

论坛徽章:
0
13 [报告]
发表于 2010-08-26 12:07 |只看该作者
回复 12# wkq5325


现在C++的实现:
class CB0 { int b0; }; //sizeof(CB0)==4
class CB1 : public CB0 { char b1; }; //sizeof(CB1)==8
class CB2 : public CB1 { char b2; }; //sizeof(CB2)==12
class CB3 : public CB2 { char b3; }; //sizeof(CB3)==16
class CB4 : public CB3 { char b4; }; //sizeof(CB4)==20
class CB5 : public CB3 { char b5; }; //sizeof(CB5)==24
...
实现紧缩排列后:
class CB1 : public CB0 { char b1; }; //sizeof(CB1)==8, sizeof1(CB1)==5
class CB2 : public CB1 { char b2; }; //sizeof(CB2)==8, sizeof1(CB2)==6
class CB3 : public CB2 { char b3; }; //sizeof(CB3)==8, sizeof1(CB3)==7
class CB4 : public CB3 { char b4; }; //sizeof(CB4)==8, sizeof1(CB4)==8
class CB5 : public CB4 { char b5; }; //sizeof(CB5)==12, sizeof1(CB5)==9
...
效果一目了然

论坛徽章:
0
14 [报告]
发表于 2010-08-26 23:32 |只看该作者
不能采用你所谓的紧缩

假如
typedef struct CA {
    int a;
    short b;
} CA;
typedef struct CB {
    CA CA;
    short c;
} CB;

否则 class *ca和class *cb
两个指针都去访问 b怎么办?

如果CB里的CA和实际CA分配不一样,编译器处理起来太麻烦了。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
15 [报告]
发表于 2010-08-27 09:02 |只看该作者
此贴再次体现人的思维定势

论坛徽章:
0
16 [报告]
发表于 2010-08-27 11:35 |只看该作者
回复 14# caboy_cu


CA::b中offset是4,size是2;CB::b中offset也是4,size是2.不会有什么问题的.
CA单独使用或构造数组时用sizeof(CA)==8,而作为其他结构的成员时使用sizeof1(CA)==6.
就像不能简单将成员size相加得到struct的size一样,这里不要使用直觉.
至于编译器嘛,不用为它担心,因为sizeof是可以通过sizeof1计算出来的.

论坛徽章:
0
17 [报告]
发表于 2010-08-27 22:20 |只看该作者
回复  caboy_cu


CA::b中offset是4,size是2;CB::b中offset也是4,size是2.不会有什么问题的.
CA单独使 ...
pan_0326 发表于 2010-08-27 11:35


建议你还是好好看看inside the c++ object model

没有你这么实现的编译器,不可能把后面的元素挤到别人的结构里

否则编译器要设计地极其复杂。
   
最简单的
typedef struct CA {
    int a;
    short b;
} CA;
typedef struct CB {
    CA CA;
    short c;
} CB;


如果你去memcpy(ca, cb.ca,sizeof(cb.ca))
怎么搞?

ca是8和cb里的ca是6,你怎么个拷法?
memcpy就是简单拷贝内存,大小不一样难道你还得加以判断然后补上0?不现实

c就是要求效率,连strncpy这种函数都不提倡用。
何况这个

论坛徽章:
0
18 [报告]
发表于 2010-08-27 23:18 |只看该作者
回复 17# caboy_cu


memcpy(ca, cb.ca,sizeof1(cb.ca))
复制6字节有问题吗?

论坛徽章:
0
19 [报告]
发表于 2010-08-28 14:22 |只看该作者
回复  caboy_cu


memcpy(ca, cb.ca,sizeof1(cb.ca))
复制6字节有问题吗?
pan_0326 发表于 2010-08-27 23:18


typedef struct CA {
    int a;
    short b;
} CA;

你怎么知道b是在第5、6个字节还是第7、8个字节?

如果第5、6个是padding, 第7、8个才是short b,怎么办?

论坛徽章:
0
20 [报告]
发表于 2010-08-28 15:53 |只看该作者
你可以自己要求怎样对齐。机器不是人,不是你想什么它就知道是什么的,必须按照一定规则来
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP