欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

struct对齐问题

程序员文章站 2022-07-04 08:12:30
...

    struct(结构体)是一种复合数据类型,其构成元素既可以是如int、long这样的基本数据类型,也可以是一些复合数据类型,如struct等。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构体的地址相同。对于结构体,编译器会自动按其自然对齐条件分配空间。数据对齐方便了数据的查询,因为指针的偏移有一定的规律,但是这是以占有更多的内存空间为代价的。


1. 对齐

    指元素存放在内存中的起始地址偏移量(1,2,4,...)。例如int类型的偏移量应该是sizeof(int)。

 

2. struct自然对齐

 

  • 元素对齐 :按照元素类型的size进行。(个人理解,元素对齐亦即结构体内部的对齐方式。在结构体内部的连续空间,按类型的size寻址。)
  • 整体对齐 : 按照结构体中size最大元素进行。( 个人理解,整体对齐亦即结构体外部的对齐方式,相当于把结构体作为一种复杂数据类型来考虑,结构体所占内存是最大元素size的倍数。)

3.指定对齐

#pragma pack(num)

#pragma pack()             取消对齐

 

  • 元素对齐 :按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行;
  • 整体对齐 :按照结构体最大的数据成员和#pragma pack指定值之间,较小的那个进行。
4.struct的成员是struct
例如,struct A{
          struct B;
          }
对齐以B中最大元素长度为准,如示例里的NODE_D和NODE_E,因为NODE_C中最大元素size是4,所以NODE_D和NODE_E的大小均为16.


示例:

 

#include  <iostream>

using namespace std;

typedef struct
{
        int b;
        char c;
        short a;
        int d;
}NODE_A;

typedef struct
{
    char c;
    int b;
    short a;
    int d;
}NODE_B;


typedef struct
{
    int a;
    int b;
    char c;
}NODE_C;

typedef struct
{
    int a;
    NODE_C c;
}NODE_D;

typedef struct
{
    char a;
    NODE_C c;
}NODE_E;

int main(){

    cout << "sizeof(int) , sizeof(short), sizeof(char) : "
            << sizeof(int) << ", " << sizeof(short) << ", " << sizeof(char) << endl;

    cout << "sizeof(NODE_A) : " << sizeof( NODE_A ) << endl;
    cout << "sizeof(NODE_B) : " << sizeof( NODE_B ) << endl;
    cout << "sizeof(NODE_C) : " << sizeof( NODE_C ) << endl;
    cout << "sizeof(NODE_D) : " << sizeof( NODE_D) << endl;
    cout << "sizeof(NODE_E) : " << sizeof( NODE_E) << endl;

    /*
        Execution Result

        sizeof(int) , sizeof(short), sizeof(char) : 4, 2, 1
        sizeof(NODE_A) : 12
        sizeof(NODE_B) : 16
        sizeof(NODE_C) : 12
        sizeof(NODE_D) : 16
        sizeof(NODE_E) : 16

    */

    return 0;
}

相关标签: struct 对齐