结构体内存对齐问题

刺骨的言语ヽ痛彻心扉 2022-06-14 01:55 249阅读 0赞

问题描述:

结构体内存对齐问题值直接的体现就是计算结构体的sizeof占用的字节数。

结构体内存对齐的几个原则,有了这几个原则,不管结构体里面是什么元素,我们都能够正确算出sizeof值(以VS2013为例)

原则1:
结构体中每一个元素放置到内存中时,它都会认为内存是以它自己的大小来划分的,因此元素放置的位置一定会在自己宽度的整数倍上开始(以结构体变量首地址为0计算)。

原则2:
在原则1的基础上,检查计算出的存储单元是否为所有元素中最宽的元素的长度的整数倍,是,则结束;若不是,则补齐为它的整数倍。

原则3:
对于一个结构体中包含另外一个结构体成员,下面例子会讲解,例如结构体S1作为结构体S2的一个数据成员,在计算时结构体S1的数据会作为一个整体去对齐。

以如下代码为例:

  1. #include <stdio.h>
  2. struct S1
  3. {
  4. char ch1;
  5. int a;
  6. double d1;
  7. char ch2;
  8. };
  9. struct S2
  10. {
  11. char ch3;
  12. struct S1 s;
  13. int b;
  14. char ch4;
  15. double d2;
  16. };
  17. int main()
  18. {
  19. printf("%d\n", sizeof(struct S1));
  20. printf("%d\n", sizeof(struct S2));
  21. return 0;
  22. }

运行结果:
24
48

下面根据上面的3个原则,可以绘制出下面两个占位图,其中1表示占用内存,0表示空闲。

结构体S1的示意图如下:

这里写图片描述

结构体S2的示意图如下:

这里写图片描述

发表评论

表情:
评论列表 (有 0 条评论,249人围观)

还没有评论,来说两句吧...

相关阅读

    相关 结构体内对齐

    结构体内存对齐规则 > 1. 第一个成员在与结构体变量偏移量为0的地址处。 > 2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。 > 对齐数 = 编

    相关 c语言结构体内对齐问题

        c语言中结构体使用是非常广泛的,但是结构体有一个问题,就是如果开头的字段属性是字符类型(char),紧跟着的是其他类型,比如整型、长整型、双精度、浮点型,这时候结构体的

    相关 676-为什么要进行结构体内对齐

    为什么要进行结构体内存对齐? 1、平台移植型好 不是所有的硬件平台都能访问任意地址上的数据;某些硬件平台只能只在某些地址访问某些特定类型的数据,否则抛出硬件异常,及遇

    相关 关于结构体内对齐总结

    内存对齐计算可谓是笔试题的必考题,但是如何按照计算原则算出正确答案一开始也不是很容易的事,所以专门通过例子来复习下关于结构体内存对齐的计算问题。(编译环境为vs2015)