结构体内存对齐——

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结构体内存对齐——相关的知识,希望对你有一定的参考价值。

什么是内存对齐

  编译器为每个“数据单元”安排在某个合适的位置上;

  C,C++语言非常灵活,它允许你干涉“内存对齐”

为什么要对齐

  性能原因:在对齐的地址上访问数据快

如何对齐

  第一个数据成员放在offset为0的位置

  其它成员对齐至min(sizeof(member),#pragma pack()所指定的值)的整数倍。

  整个结构体也要对齐,结构体的总大小对齐至各个成员中最大对齐数的整数倍。

#include<iostream>
#include <stdio.h>

using namespace std;

struct Test
{
    char a;

    double b;
    char c;
};
//第一个成员与结构体变量的偏移量为0(第一个成员与结构体存在一块,所以地址一样)
//其它成员要对齐某个数(对齐数)的整数倍的地址
//对齐数取编译器预设的一个对齐整数与该成员大小的较小值
//结构体总大小为最大对齐数的整数倍
/*结构体里的第一个大小就是结构体的大小(地址相同),char大小本来是1,但它在第一个,所以char的大小应该就是结构体大小(8)
其它大小就看本身与系统的大小,取较小值(对齐数),比如,int是4,系统默认8,所以应该是4*/
int main()
{
//  说明test跟test.a地址是一样的,也就是说结构体第一个大小跟系统一致    

Test test;
    char *p = (char*)&test;
    printf("p=%p\n", p);
    p = &test.a;
    printf("p=%p\n", p);
    
    cout << sizeof(Test) << endl;
    return 0;
}

 

以上是关于结构体内存对齐——的主要内容,如果未能解决你的问题,请参考以下文章

[.NET] 结构体布局详解与结构体内存对齐具体方式

结构体字节对齐问题探究

结构体字节对齐问题探究

详解结构体内存对齐

详解结构体内存对齐

结构体内存对齐