结构体中的内存对齐


#include <iostream>
struct POINTER
{
    void* ptr;
};

struct A
{
    char a;
};

struct B
{
    char a;
    char b;
};

struct C
{
    char a;
    int b;
    long c;
};

struct C1
{
    char a;
    short d;
    char f;
    char e;
    int b;
    long c;
};

struct C2
{
    int a;
    char d;
    int f;
    char e;
    int b;
    long c;  ///6*4
};

struct C3
{
    char d;
    char e;
    int a;
   
    int f;
  
    int b;
    long c;  ///5*4
};


union MyUnion
{
    long c;
    int a;
    char b[12];
};
struct D
{
    long c;
    char a;
    int b;
};

struct E
{
    char a;
    long c;
    int b;
};

struct F
{
    char a;
    long c;
    char b;
};

struct G
{
    char a;
    long c;
    F b;
};

struct H
{
    char a;
    char b;
    short c;
};

struct I
{
    char a;
    char b;
    int c;
};

struct EMPTY_CLASS
{
};

struct EMPTY_CLASS_WITH_VIRTUAL
{
    virtual ~EMPTY_CLASS_WITH_VIRTUAL() {}
};

#define CALC_STRUCT_SIZE(T) \
    std::cout <<"size of type " << #T << " is " << sizeof(T) << std::endl;

int main(int argc, char** argv)
{
    CALC_STRUCT_SIZE(A);
    CALC_STRUCT_SIZE(B);
    CALC_STRUCT_SIZE(C);
    CALC_STRUCT_SIZE(C1);
    CALC_STRUCT_SIZE(C2);
    CALC_STRUCT_SIZE(C3);  //save memory than C2
    CALC_STRUCT_SIZE(MyUnion);
    CALC_STRUCT_SIZE(D);
    CALC_STRUCT_SIZE(E);
    CALC_STRUCT_SIZE(F);
    CALC_STRUCT_SIZE(G);
    CALC_STRUCT_SIZE(H);
    CALC_STRUCT_SIZE(I);

    CALC_STRUCT_SIZE(EMPTY_CLASS);
    CALC_STRUCT_SIZE(EMPTY_CLASS_WITH_VIRTUAL);

    CALC_STRUCT_SIZE(char*);
    CALC_STRUCT_SIZE(short*);
    CALC_STRUCT_SIZE(int*);
    CALC_STRUCT_SIZE(long*);
    CALC_STRUCT_SIZE(void*);
    CALC_STRUCT_SIZE(F*);
    CALC_STRUCT_SIZE(POINTER);
        return 0;
}


注意在64为系统中,指针地址的大小是long long型,8个字节 

而long型数据的字节数是需要注意的,简单而言可以看以下表格

因为我测试上述例子是在win64下,所以long是4个字节,如果在liunx下,那就是 8个字节了

参考:

C++字节对齐 - 知乎

猜你喜欢

转载自blog.csdn.net/qq_31638535/article/details/128857318