江苏做网站怎么收费多少/小说推广接单平台
C语言的内存的字节对齐的理解于运用
由于现在内存的安排一般是4字节对齐的,
所以在进行结构的定义的时候,顺序不同其所占内存也是不一样的。
1, 问题的提出
typedef struct t {
int num1;
int num2;
char b;
char a;
}T;
typedef struct t2 {
int num;
char a;
}T2;
int
main(void)
{
T lt = {1,2,'a','b'};
T2 lt2 = {2,'a'};
printf("sizeof(lt) = %d/n", sizeof(lt)); //12
printf("sizeof(lt2) = %d/n", sizeof(lt2)); //8
return 0;
}
sizeof(lt) = 12
sizeof(lt2) = 8
可以看到虽然T只定义两个char,按推理来说应该是占4+4+1+1应该是10。
但是结果却是12。按推理来说第2个结果的长度应该是4+1应该是5才对,
但结果却是8。何解?
在C语言中我们的内存一般是4字节对齐的,这样CPU在处理数据的时候,
才不至于浪费时间。编译器回把多余的空间填充成0。
2, 问题的解决
所以当我们在定义结构的时候就要注意这个事实,才不会浪费空间。
浪费空间的结构设计:
struct ab {
int id;
char sit1;
int num;
char sit2;
};
如果这样交叉定义的话,将会浪费一些空间。上面的定义结构体ab,
的sizeof的值,将会是4+4+4+4,按照4字节对齐的安排。
而,这样定义将会节省一些空间:
struct ab {
int id;
int num;
char sit1;
char sit2;
};
这样的话,所占空间将是4+4+4。
3, 怎么办
当定义结构时,如果结构成员的所占内存大小不是4的倍数,
多出的将会自动被初始化为0。
struct ac {
int a;
char b[10];
};
这里的结构实际上分配了 10+4+2个字节空间。
因为这样才可以凑够4的倍数。
小结: 在不同的平台对齐的方式不一样,有的是8字节对齐的,但大多数是4字节对齐的。
在写程序时,要根据同平台具体处理。