跳至内容
响水凹
欢迎来到 Guang-Wen Duan (Dennis Duan) 的个人 Wiki
用户工具
登录
站点工具
搜索
工具
显示页面
过去修订
反向链接
最近更改
媒体管理器
网站地图
登录
>
最近更改
媒体管理器
网站地图
您的足迹:
computer:c:tips:alignment
本页面只读。您可以查看源文件,但不能更改它。如果您觉得这是系统错误,请联系管理员。
====== 对齐限制(Alignment) ====== 很多计算机出于效率等原因的考虑,对数据对象在内存中的存储地址有一定的限制。比如,某种计算机要求一个32位(4字节)整数的存放地址必须是4的倍数,此时称这种整数的对齐模数(alignment modulus)为4。如果违反了这个限制,可能会导致运行时错误,或者意想不到的结果。 所以,当我们在有不同对齐要求的对象指针之间进行转换时,务必小心,可能会因违反对齐限制而出错。 一般而言,如果类型A的对齐要求至少和类型B一样严格(即A的对齐模数不小于B的对齐模数),则把指向类型A对象的指针转换成指向类型B对象的指针是安全的,反过来就不一定。这也是所有指针都可以转换成void */char *指针的原因,因为void */char *指针的对齐要求是最低的。 下面这个程序利用结构体的填充大小来估算某种数据类型的对齐要求(参见:[[.:struct_pad_size|结构体的填充与大小]]): <code c> #include <stdio.h> #include <stdlib.h> #define DATA_TYPE double struct s { char c; DATA_TYPE d; }; int main(void) { printf("sizeof = %ld, alignment modulus is %ld\n", sizeof(DATA_TYPE), sizeof(struct s) - sizeof(DATA_TYPE)); exit(0); } </code> {{tag>C语言}}
computer/c/tips/alignment.txt
· 最后更改: 2014/11/01 02:02 由
127.0.0.1
页面工具
显示页面
过去修订
反向链接
回到顶部