字节对齐

本文深入探讨了编译器如何处理结构体的字节对齐,包括成员变量的对齐值和结构体自身的对齐规则。通过实例分析了VS10和CodeWarrior编译器在字节对齐上的差异,并介绍了#pragma pack和__declspec(align(n))指令的影响。
摘要由CSDN通过智能技术生成

在codeWarrior编译的程序 和 win7下vs10编译的程序 利用24L01无线模块进行通讯时.除了学到了 二者程序存储的机器字节顺序不同,在使用如short这样的大于1字节的变量类型 需要进行字节的逆序 以外 ,在编写协议的时候想用结构体简化程序,减少使用memcpy, 但我知道结构体在编译的时候编译器一般存在一些“字节对齐”规则(包括了align of member  和 structure alignment) ,之前只是很马虎的了解了一下,今天又认真了解了“字节对齐”.

 

为了简化叙述,这里用 [n 这个符号代表一个成员变量 相对于他所在的结构体的首地址的offset字节数.

 

(1) align of member 

align of member 其实也就是在决定每个成员变量的 [n 

而它完全由 该成员变量的对齐值决定.

而某一个成员变量的对齐值 = min( pack setting value, sizeof(该成员变量) )

对于vs10,可以用#pragma pack(show) 宏命令显示 pack setting value 的值(在vs上一般是8)

(在codeWarrior 5.9.0里#pragma pack 语句编译时会被显示警告,意思是没有理会该宏,所以对于codeWarrior 对“字节对齐”的规定是否遵循一般的规则 也很难得知,自己也只能靠实践去找出)

对齐值怎么决定每个成员变量的 [n 呢?

对于vs10,编译器按照

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值