#pragma pack (1) /* 指定按1字节对齐 */ #pragma pack () /* 取消指定对齐,恢复为默认4字节对齐*/ (2). 使用GNU __attribute__伪指令: __attribute__((aligned(n))): 让所作用的数据成员对齐在n字节的自然边界上;如果结构中有成员的长度大于n,则按照最大成员的长度来对齐; __attribute__((packed...
int length1 = sizeof(testlength1); //4个字节对齐,占用字节1111 1011 1000,length = 12 typedef struct { char bb2; //1个字节对齐 1 int aa2; //4个字节对齐 01111 short cc2; //2个字节对齐 11 char dd2; //1个字节对齐 1 } testlength2; int length2 = sizeof(testlength2); //4个...
也许你会说,这个简单,计算每个类型的大小,将它们相加就行了,以32为平台为例,int类型占4字节,char占用1字节,所以:4 + 3 + 4 = 11,那么这个结构体一共占用11字节空间。好吧,那么我们就用实践来证明是否正确,我们用sizeof运算符来求出这个结构体占用内存空间大小,sizeof(MemAlign),出乎意料的是,结果居然为12?
intlength1 =sizeof(testlength1);//4个字节对齐,占用字节1111 1011 1000,length = 12 typedefstruct { charbb2;//1个字节对齐 1 intaa2;//4个字节对齐 01111 shortcc2;//2个字节对齐 11 chardd2;//1个字节对齐 1 } testlength2; intlength2 =sizeof(testlength2);//4个字节对齐,占用字节1011 11...
// 此结构体元素s1占用最大内存,因此对齐字节为8 // s1:元素开始位置为0,占用8个字节,结束字节是7 // s2:元素开始字节为8,占用10个字节,结束字节是17 // s3:元素开始字节为18,占用1个字节,结束字节为18(至此已占用19字节) // 因此整个结构体占用24 个字节(3*8=24) typedef struct _S2 { double s1...
字节对齐的问题主要就是针对结构体。 3.1.1 简单示例 先看个简单的例子(32位,X86处理器,GCC编译器): 【例1】设结构体如下定义: 1 struct A{ 2 int a; 3 char b; 4 short c; 5 }; 6 struct B{ 7 char b; 8 int a; 9 short c;
对齐方法01.jpg 示例二: // struct = 1+8+1+1structdemostruct_b{// baseAddr length padding// addr 1 7// addr+8 8 0// addr+16 1 0// addr+17 1 0uint8_ta;uint64_tb;uint8_tc;uint8_td;}; 上面的例子中如果没有结构体的内存对齐,真实的大小为 1 + 1 + 8+ 1 = 11 字节 ...
为高字节,0x22 为低字节.对于大端模式,就 将 0x11 放在低地址 中,即 0x0010 中,0x22 放在高地址...
(testlength3);//4个字节对齐,占用字节1100 1111 1100,length = 12typedefstruct{charbb4;//1个字节对齐 1chardd4;//1个字节对齐 1shortcc4;//2个字节对齐 11intaa4;//4个字节对齐 1111} testlength4;intlength4=sizeof(testlength4);//4个字节对齐,占用字节1111 1111,length = 8intmain(void) { ...