结构体内存对齐
我们先来看一段代码
struct S
{
char c;
char a;
int i;
};
int main ()
{
printf("%d\n",sizeof(S));
}
计算S这个结构体占了多少内存
我们怎么算呢
第一步
第一个成员为结构体偏移量为0的地址
其它成员为某个对齐数的整数倍的地址
对齐数是个什么东西呢
对齐数=编译器默认对齐数与该成员大小的相比较的较小值
vs中的默认对齐数是8
当然这个默认对齐数也是可以调整的,我们先来了解一下为什么需要搞这个结构体的内存对齐
结构体内存对齐其实说白了就是拿空间换时间的一种方法。因为电脑一般都是32位和64位的,
以32位机器为例,在读取内存时,一次跳过4个字节,如果按照从头排着对齐的方式来对齐的话
那么,可能就需要进行两次访问才能成功,而占用空间大的,也就是内存对齐之后只需要访问一次就可以成功,减少了运行时间,虽然损耗了一部分时间,但是换取了速度
另外这个对齐数也是可以更改的
struct S
{
char c1;//1
//7
double d;//8
};
int main ()
{
struct S s;
printf("%d\n",sizeof(s));
return 0;
}
这段代码如果按照正常那么会算出16
但是如果更改一下默认对齐数
那么就会算出12的内存
因此如果在设置结构体的时候结构体的对齐方式不合适,可以自己来设计结构体的对齐数
一般来说都是设置成2,4,8,16。。。 这样的数
还有一种情况就是如果结构体嵌套了结构体那么应该怎么计算内存大小呢
这种情况是因为,如果嵌套了结构体,那么就对齐到自己结构体的最大对齐数的整数倍,
最后总大小=含结构体的最大对齐数
还有一个offsetof的概念,是一个宏的概念,是计算偏移量的一个
0 8 4 分别对应着char int double 的偏移量,所谓偏移量就是相对于起始位置移动了多少个字节。
好的今天就先写到这里,明天继续小结一下,现在期末考试真的没有时间啊,好难