免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 6551 | 回复: 33
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-23 18:57 |只看该作者 |倒序浏览
class CA {
    int a;
    short b;
};
class CB : public CA {
    short c;
};
上面是C++的类定义例子,sizeof(CA)==8,实际只占6字节;sizeof(CB)==12,实际只需
8字节.
typedef struct CA {
    int a;
    short b;
} CA;
typedef struct CB {
    CA CA;
    short c;
} CB;
上面是等效的C例子,sizeof(CA)==8,实际只占6字节;sizeof(CB)==12,实际只需8字节.
为什么不能紧缩排列呢?因为sizeof反映的是数组中个体的大小,所以要求必须是对齐
的倍数,CA是4字节对齐,所以sizeof(CA)==8,sizeof(CB)==12.而结构定义中后续字段
不一定要求>=4的对齐.
现在假设在C/C++中增加一个关键字sizeof1,表示非数组中的结构大小,sizeof1(CA)
==6,sizeof(CA)==8,sizeof和sizeof1是有关联的:
sizeof(CA)=(sizeof1(CA)+align(CA)-1)/align(CA)*align(CA)
现在构造CB时,就可以在sizeof1(CA)后增加字段,结果sizeof(CB)==sizeof1(CB)==8.


http://blog.163.com/coo_bin/

论坛徽章:
0
2 [报告]
发表于 2010-08-23 19:06 |只看该作者
“因为sizeof反映的是数组中个体的大小,所以要求必须是对齐
的倍数”这句话说的最好{:3_187:}
sizeof(CA)=(sizeof1(CA)+align(CA)-1)/align(CA)*align(CA)这个公式怎么得到的??

论坛徽章:
0
3 [报告]
发表于 2010-08-23 19:44 |只看该作者
字节对齐应该是为了提高存取效率吧

论坛徽章:
0
4 [报告]
发表于 2010-08-23 21:45 |只看该作者
#pragma pack(1)

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
5 [报告]
发表于 2010-08-23 21:49 |只看该作者
因为CA可能单独使用,为了保持统一,CA就只好是8了

论坛徽章:
0
6 [报告]
发表于 2010-08-24 11:40 |只看该作者
回复 5# hellioncu


    顶。

论坛徽章:
0
7 [报告]
发表于 2010-08-24 12:16 |只看该作者
回复 2# pengjianbokobe


    这个公式是sizeof1(CA)向上取align(CA)的倍数的公式

在单独使用时,sizeof(CA)和sizeof1(CA)都可以,因为内存分配自动进行更大的对齐
构造数组时要使用sizeof(CA),能保证每个下标都正确对齐
构造新结构或继承时,使用sizeof(CA)很可能浪费,层次越多越严重,使用sizeof1(CA)最紧缩

C语言之所以没这么做,可能是出于要简洁的理由。但加上sizeof1也没复杂多少,编译器自动优化,
一般情没必要直接使用sizeof1。
而构造编译器也不复杂,原来存储sizeof和align,现在存储sizeof1和align,因为sizeof可以算出。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
8 [报告]
发表于 2010-08-24 14:43 |只看该作者
class CA {
    int a;
    short b;
};
class CB : public CA {
    short c;
};
上面是C++的类定义 ...
pan_0326 发表于 2010-08-23 18:57

必须是这样的。否则你定义结构数组时,后边的结构都乱套了。

论坛徽章:
0
9 [报告]
发表于 2010-08-24 16:02 |只看该作者
回复 8# yulihua49


class CB {
    int a;
    short b;
    short c;
};
上面是CB的内部紧缩结构,sizeof(CB)==sizeof1(CB)==8.
构造数组怎么会乱套呢?是现在的C/C++太粗糙了.

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
10 [报告]
发表于 2010-08-25 13:33 |只看该作者
回复  yulihua49


class CB {
    int a;
    short b;
    short c;
};
上面是CB的内部紧缩结构 ...
pan_0326 发表于 2010-08-24 16:02



  如果是:
class CB {
    int a;
    short b;
    short c;
   char d;
};

再不进行尺寸的scale就肯定乱了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP