内存对齐问题

目录:

引出问题
为什么要内存对齐(问题的重要性)
如何解决问题
    对齐规则

引出问题

class test{
    char ch;
    int i;
};

int main(){
    test t;
    cout<<sizeof(t)<<endl;
    return 0;
}

char:2个字节,int:4个字节。但是最后输出的结果是8个字节

定义:实际计算机对基本类型的存放并不是简单的相加,它们会要求这些数据首地址的值是某个数k(通常是4或8,取决于操作系统)的倍数,这就是内存对齐。

为什么要内存对齐

假设这样一个有这样一个场景,分配宿舍,有两层楼,编号第一层0-7,第二层8-15。我有一个班需要占用4间宿舍,占的是第一层的6号、7号,即最后两间,第二层的8号、9号,即头两间。我是班主任,我要上门去把每个宿舍的人叫到操场上,我每次只能叫一层楼的。我需要叫两次。

如何解决

那我怎么办呢,我学聪明了,反正大把宿舍。我就要把我们班的放在同一层楼,就算不能住满,就让他空着呗。这样我叫一次就可以了。

目的:牺牲内存,减少操作

对齐规则

class test{ //有效对齐值为8(long)
    char ch; //0-1
    //2-3填充
    int i; //4-7
    char ch2; //8-9
    //10-14填充
    long l; //15-21
    char ch3; //22-23
    //23-29填充
};

int main() {
    test t;
    cout<<sizeof(t)<<endl;
    return 0;
}

1)对于每个变量,第一个变量的偏移量为0,以后每个成员的偏移量都是该成员与有效对齐值中较小的那个整数倍

举例:int-4,有效-8,小的整数倍:4,如果前面那个占了5个字节,那么我就会去第7,宁愿填充前面的,也要让我自己对齐。能塞就塞,塞不进就重新开辟。

2)结构体的总大小为 有效对齐值 的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。
3)如果有需要,编译器会在成员之间加上填充字节


参考及引用:
https://zhuanlan.zhihu.com/p/30007037

posted @ 2022-03-29 10:25  Canwaiting  阅读(39)  评论(0编辑  收藏  举报