内存字节对齐是指,为了保证CPU对内存的访问效率,各种类型数据需要按照一定的规则在内存存放,而不是完全字节挨字节的顺序存放。
1、结构体变量的首地址能被其最宽数据类型成员的大小整除
3、结构体变量所占总空间的大小必定是最宽数据类型大小的整数倍。多的在末尾填充字节。
typedef struct foo{
char flag;
int i;
} foo;
int main() {
foo f;
f.flag = 'T';
int* pi = (int*)(&f.flag + 1);
*pi = 0x01020304;
cout << f.flag << " " << f.i << endl;
return 0;
}
程序中,给flag+1地址处赋值为一个4字节整数0x01020304,因为有3个字节并未影响到变量i,所以赋值结果为0x01。(这也牵扯到了内存大小端排布)
typedef struct foo{
char flag;
int i;
} foo;
int main() {
foo f;
f.flag = 'T';
int* pi = &f.i;
*pi = 0x01020304;
cout << f.flag << " " << f.i << endl;
return 0;
}
一些编译器允许程序员在代码中通过预处理指令 #pragma pack(n)或类型属性__attribute__((packed))来改变默认的内存对齐条件。
这里我们采用一字节对齐:
No comments yet.