响水凹

欢迎来到 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 *指针的对齐要求是最低的。

下面这个程序利用结构体的填充大小来估算某种数据类型的对齐要求(参见:结构体的填充与大小):

#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);
}
computer/c/tips/alignment.txt · 最后更改: 2014/11/01 02:02 由 127.0.0.1