政府网站建设常态化网站编辑怎么做
结构体相信大家已经了解过了,现在我们深入讨论一个问题,计算结构体的大小
也是很热门的一个考点:结构体内存对齐
先看看下面结构体的大小
typedef struct Test
{char a;char b;char c;
}Test;
很容易看出答案为3,结构体的大小位各成员之和
但是如果代码变成这样的呢
typedef struct Test
{char a;double b;int c;
}Test;
难道会是1+8+4,但是运行结果却不是
这就是我们要进行的内存对齐
typedef struct Test
{char a; //1+7double b; //8int c; //4+4
}Test;
此时答案为24
可以得到:基本数据类型的对齐值为所占空间的大小,自定义类型的对齐值为内部成员的最大空间
typedef struct Test
{char a; //1+3int b; //4double c; //8
}Test;
此时我们的答案变成了16
所以成员数据在没有要求的情况下,一般从小到大安排数据,所占空间最小。
当我们的程序有了自定义类型的对齐值时,例如:
#pragma pack(4)
typedef struct Test
{char a; //1+3double b; //8int c; //4
}Test;
程序的指定对齐值-------#pragma pack(n),n必须是2的幂次方,n为1时,直接将其内部成员加起来即可
##pragma pack(),取消设置的默认对齐数,还原为默认
但是如果程序如下
#pragma pack(4)
typedef struct Test
{char a; //1+1short b; //2int c; //4
}Test;
此时我们的答案为8
程序的有效对齐值为程序指定对齐值与自身对齐值的较小值
特别注意,我们看下面代码(示例)
typedef struct Test
{int a;struct t{char b;char c;char d;char e;};short f;
}Test;
按照我们上面的内存对齐的规则,答案应当为12,但是结构确为8 ,在C++中,只要结构体内部的结构带名字(t只是举例),此时内部的结构体就变成了结构体类型,其不占空间大小
最后,我们为什么要进行内存对齐?
拿两张图来说
不对齐
对齐
结构体的内存对齐是用空间换时间的做法
大部分参考资料这样说
1. 平台原因(移植原因):
不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
2. 性能原因:
数据结构(尤其是栈)应该尽可能地在自然边界上对齐。 原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。