关于结构体对齐
在一篇关于struct字节对齐详解的文章中看到:
如果在编程的时候要考虑节约空间的话,那么我们只需要假定结构的首地址是0,然后各个变量按照上面的原则进行排列即可,基本的原则就是把结构中的变量按照类型大小从小到大声明,尽量减少中间的填补空间.还有一种就是为了以空间换取时间的效率,我们显示的进行填补空间进行对齐,比如:有一种使用空间换时间做 法是显式的插入reserved成员:
struct A{
char a;
char reserved[3];//使用空间换时间
int b;
}
同时又在一篇关于c++代码优化的文章中看到把结构体的成员按照它们的类型长度排序,声明成员时把长的类型放在短的前面;把结构体填充成最长类型长度的整倍数
现在有两点疑惑:
1、我觉得,如果只是从节约空间上考虑,按照类型大小从小到大声明与从大到小是不是没有区别啊?
2、还有就是如果在默认情况下,编译器是不是采用的空间换时间做法?
[解决办法]
与最长的字节类型对齐就是了
struct Base_A
{
//double aa;
int a;//4
char c;//1
char d;//1
};
这个就与int类型对齐,两个char拼接,知道拼接够了4个字节,那么就开始增长,按4个字节一增长
struct Base_A
{
//double aa;
int a;//4
char c;//1
char d;//1
char e;
char f;
};这还是8字节
struct Base_A
{
//double aa;
int a;//4
char c;//1
char d;//1
char e;
char f;
char g;
};这就是12个字节
结论:按最高字节类型增长,按最高字节类型对齐,小于最高字节的类型从左向右拼接,超过就增长,不够最高字节类型字节数就不增长
[解决办法]