__ attribute__((packed))得变量或者结构体成员使用最小的对齐方式,即对变量是一字节对齐,对域(field)是位对齐. 五、什么时候需要设置对齐 在设计不同CPU下的通信协议时,或者编写硬件驱动程序时寄存器的结构这两个地方都需要按一字节对齐。即使看起来本来就自然对齐的也要使其对齐,以免不同的编译器生成的代码不...
内存对齐虽然和硬件有关,但是决定对齐方式的是编译器,如果你的硬件是64位的,却以32位的方式编译,那么还是会按照4个字节对齐。 对齐方式可以通过编译器参数修改,以VS2010为例,更改对齐方式的步骤为:项目 --> 属性 --> C/C++ --> 代码生成 --> 结构成员对齐,如下图所示: ...
如果该变量是一个 int 型数据,那么编译器就会按4字节或4字节的整数倍对齐;如果该变量是一个 short 型数据,那么编译器就会按2字节或2字节的整数倍边界对齐;如果是一个 char 类型的变量,那么编译器就会按照1字节对齐。 程序示例 #include <stdio.h> int a1 = 1; int a2 = 2; char c1 = 'M'; ...
这段代码里我们使用了#pagma pack宏,表示结构体按1字节对齐。也就是说结构体变量st_val3总大小是内部成员变量占用字节数总和,没有字节填充。 现在编译运行如下: sizeof(structst3)=16st_val3addr=0x7ffee13a93b8st_val3.a1addr=0x7ffee13a93b8st_val3.a2addr=0x7ffee13a93bcst_val3.a3addr=0x7ffee1...
最后两句代码,从奇数边界去访问 unsigned short 型变量,显然不符合对齐的规定。在X86上,类似的操作只会影响效率;但在MIPS或者SPARC上可能导致error,因为它们要求必须字节对齐。 又如对于3.1.1节的结构体 struct B,定义如下函数: voidFunc(structB*p){//Code} ...
1. 对齐原则: 【原则1】数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。 【原则2】结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对...
如果要对齐,我觉得最好是定义好每行输出几个。比如,每行输出 5 个数字。比如,我把代码改成下面...
代码如下:#include <stdio.h> int main(){ int a[5][2] = { 1,6,4,2,5,6...
用于对齐:向上对齐和向下对齐:#define ROUND_UP(x, align) (((int) (x) + (align - 1)) & ~(align - 1))#define ROUND_DOWN(x, align) ((int)(x) & ~(align - 1))用于检查是否已经对齐:#define ALIGNED(x, align) (((int)(x) & (align - 1)) == 0)其中,x为要计算...