免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
21 [报告]
发表于 2010-08-28 17:58 |只看该作者
本帖最后由 pan_0326 于 2010-08-28 18:19 编辑

回复 19# caboy_cu


在什么系统中b在5,6字节不行?
规则并不复杂:数组的分配和运算时用sizeof,其他情况都可用sizeof1

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
22 [报告]
发表于 2010-08-28 22:35 |只看该作者
struct  A
{
char c;
int i;
};

struct B
{
char c[3];
};

struct C
{
struct B b;
struct A a;
};

论坛徽章:
0
23 [报告]
发表于 2010-08-28 23:34 |只看该作者
__attribute__((packed))

论坛徽章:
0
24 [报告]
发表于 2010-08-29 00:19 |只看该作者
回复 22# zhaohongjian000


sizeof1并非#pragma pack(1),结构的首部和中间仍然要对齐填充,尾部不需要对齐填充.
struct C
{
  char c[3];
  char fill1;
  
  char c;
  char fill2;
  char fill3;
  char fill4;
  int i;
};
sizeof(struct C)==sizeof1(struct C)==12


__attribute__((packed))是局部#pragma pack(1),不是sizeof1的效果

论坛徽章:
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
25 [报告]
发表于 2010-08-29 10:19 |只看该作者
本帖最后由 yulihua49 于 2010-08-29 10:21 编辑
回复  pengjianbokobe


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

在单独使用时,siz ...
pan_0326 发表于 2010-08-24 12:16



    没用过小型机吧?如果数据边界不对齐,存取该数据时直接就core dumpped 了。
使用pack(1),你的程序不能移植到其它CPU。所以不仅是存取效率问题。
(如果是网络程序,一端是小型机(大型机)怎么办?)
现在内存都巨大,何必在乎这点空间?如果需要在网络传送结构,建议采用JSON或XML格式。

论坛徽章:
0
26 [报告]
发表于 2010-08-29 16:46 |只看该作者
回复 25# yulihua49


回帖时请看看我后面的回复
再说一遍:sizeof1不是pack(1),所有的数据对齐仍然遵守,大端也如此.
速度无限快,内存无限大,用C/C++干嘛?

论坛徽章:
0
27 [报告]
发表于 2010-08-29 17:20 |只看该作者
本帖最后由 caboy_cu 于 2010-08-29 17:22 编辑
回复  yulihua49


回帖时请看看我后面的回复
再说一遍:sizeof1不是pack(1),所有的数据对齐仍然遵守,大 ...
pan_0326 发表于 2010-08-29 16:46


为啥就不能去看看书呢?
inside the c++ object model

英文版3.4章有详细描述


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

CA *pa,*pb;

pa = &(CB.CA);
pb = &CA;

*pa = *pb

你这个时候怎么办? bitwise是把CA的所有内容拷贝到CB的CA里去,如果你的short c也被打包在CA里,值就是错误的

论坛徽章:
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
28 [报告]
发表于 2010-08-29 17:43 |只看该作者
回复  yulihua49


回帖时请看看我后面的回复
再说一遍:sizeof1不是pack(1),所有的数据对齐仍然遵守,大 ...
pan_0326 发表于 2010-08-29 16:46



     sizeof1是你写的?没必要吧,结构定义后的其它变量也要对齐。差不了几字节,完全没必要。

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


老脑筋是理解不了新方法的
sizeof1(CA)==6
*pa = *pb //只需复制6字节,short c不会出现的

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


老脑筋是理解不了新方法的
sizeof1(CA)==6
*pa = *pb //只需复制6字节,short c不会 ...
pan_0326 发表于 2010-08-29 18:08


你以为复制6字节耗费的时间比8字节少?

bitwise生成的指令片断还得去判断去除padding后的实际大小?这样的编译器就等着你来开发了!

还真以为memcpy是一个字节一个字节拷贝?


在c语言里面,永远不要太自信,甚至自信到怀疑标准的地步,肯定有人都会考虑到你能想到的问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP