免费注册 查看新帖 |

Chinaunix

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

关于字符对齐一问,牛人看过来 [复制链接]

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
21 [报告]
发表于 2006-11-30 15:12 |只看该作者
x86 上就相当直观
#pragma pack(1)
    movb    $97, -24(%ebp)
    movl    $12, -23(%ebp)
    movw    $23, -19(%ebp)
    movl    $7, %eax

/* #pragma pack(1) */
    movb    $97, -24(%ebp)
    movl    $12, -20(%ebp)
    movw    $23, -16(%ebp)
    movl    $12, %eax

论坛徽章:
0
22 [报告]
发表于 2006-11-30 15:25 |只看该作者
都是bit fields惹的祸啊
    unsigned int ihl:4;
    unsigned int version:4;
合起来只占了8位,所以尽管ihl和version都是int,
实际只占了一个char的空间,
因为只花费了一个char, 接下来空间自然就对齐,并且保证是无空隙的。

楼主可以将 unsigned int version:4 改成 unsigned int version:5,
结果struct就不会pack在一起了。

论坛徽章:
0
23 [报告]
发表于 2006-11-30 15:28 |只看该作者
原帖由 gvim 于 2006-11-30 15:12 发表
x86 上就相当直观
#pragma pack(1)

/* #pragma pack(1) */


受教了,崇拜ing...

论坛徽章:
0
24 [报告]
发表于 2006-11-30 16:35 |只看该作者
有点意思!
有些系统屈服于硬件;有些系统屈服于软件,但最终都是屈服于硬件的。
如果你只会c,不去搞点汇编和硬件,还真很难找到点自信!
尤其是在一些思维比较细腻的哥们面前。

论坛徽章:
0
25 [报告]
发表于 2006-11-30 18:11 |只看该作者
#if __BYTE_ORDER == __LITTLE_ENDIAN
    unsigned int ihl:4;
    unsigned int version:4;
#elif __BYTE_ORDER == __BIG_ENDIAN
    unsigned int version:4;
    unsigned int ihl:4;
#else
# error        "Please fix <bits/endian.h>"
#endif
    u_int8_t tos;
    u_int16_t tot_len;
上面4字节
    u_int16_t id;
    u_int16_t frag_off;
上面4字节
    u_int8_t ttl;
    u_int8_t protocol;
    u_int16_t check;
上面4字节
    u_int32_t saddr;
上面4字节
    u_int32_t daddr;
上面4字节

任何平台上都是对齐的
协议设计者和软件设计者早考虑到了

论坛徽章:
0
26 [报告]
发表于 2006-11-30 20:55 |只看该作者
标题怎么是“字符对齐”??
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP