在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,编译器按照