C++ struct、union、class内存对齐问题解析

    技术2024-07-16  80

    C++ struct、union、class内存对齐问题解析

    前言struct、class与union内存对齐原则pragma pack(n)

    前言

    都不是很想将其归入到C++专栏,算了。

    struct、class与union内存对齐原则

    结构(struct)或联合(union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储。 这一条其实是非常好理解的。其实这个做法的含义就是,对于struct或者是union内的每个元素,都有很合适的内存地址来存储。 那么如果是struct对外呢?其实规则也很简单:找到这个struct中元素所占空间最大的,那么这个struct对外表现的空间占用大小,一定要能被这个最大元素大小整除(基本上就是向上取整了) 所以咱们直接看一下这个例子:

    struct test{ char ch1; int i1; double d1; };

    可以看到double是8字节,所以这个struct总共占用的内存大小应该要被8整除,这里占用大小是16byte。 OK现在对内对外都了解了,咱们就来看看这样的一种情况:假如struct里嵌套struct,该如何分析?其实就很简单了对吧,先把内部struct的内部分析清楚,对内部struct的内部每个成员,都希望占用的地方能被自己的大小所整除。然后内部struct分析完成后,还得给它补充一下对外的表现,要能被内部最大的元素大小所整除,最后再分析外部struct即可。

    至于union,千万别被骗了好吧,分清楚什么才是真的成员。

    pragma pack(n)

    这个预编译指令非常好理解,之前你想搞内存对齐,要按照自己的size能不能整除地址来做对齐,现在不只是看你的size了,要看min(sizeof(), n),所以如果你设置了n=1,则默认不做内存对齐。 咱们的VS默认是n=8,而gcc编译器默认n=4.

    Processed: 0.031, SQL: 9