gpt4 book ai didi

c - sizeof(),C 结构中的对齐方式 :

转载 作者:太空狗 更新时间:2023-10-29 17:18:58 25 4
gpt4 key购买 nike

前言:我是否研究过结构对齐。看了this问题,this一个还有this一个 - 但仍然没有找到我的答案。

我的实际问题:

这是我为澄清我的问题而创建的代码片段:

#include "stdafx.h"
#include <stdio.h>

struct IntAndCharStruct
{
int a;
char b;
};

struct IntAndDoubleStruct
{
int a;
double d;
};

struct IntFloatAndDoubleStruct
{
int a;
float c;
double d;
};

int main()
{
printf("Int: %d\n", sizeof(int));
printf("Float: %d\n", sizeof(float));
printf("Char: %d\n", sizeof(char));
printf("Double: %d\n", sizeof(double));
printf("IntAndCharStruct: %d\n", sizeof(IntAndCharStruct));
printf("IntAndDoubleStruct: %d\n", sizeof(IntAndDoubleStruct));
printf("IntFloatAndDoubleStruct: %d\n", sizeof(IntFloatAndDoubleStruct));
getchar();
}

它的输出是:

Int: 4
Float: 4
Char: 1
Double: 8
IntAndCharStruct: 8
IntAndDoubleStruct: 16
IntFloatAndDoubleStruct: 16

我在 IntAndCharStructIntAndDoubleStruct 中看到对齐。

但我就是不明白 IntFloatAndDoubleStruct 一个

简单地说:为什么不是 sizeof(IntFloatAndDoubleStruct) = 24

提前致谢!

p.s:我使用的是 Visual-Studio 2017,标准控制台应用程序。

编辑:根据评论,测试 IntDoubleAndFloatStruct(元素的不同顺序)并在 sizeof() 中得到 24 - 如果答案也能说明并解释这种情况,我将很高兴。

最佳答案

在您的平台上,以下内容成立:intfloat 的大小均为 4。double 的大小和对齐要求为8.

我们从您显示的 sizeof 输出中知道这一点。 sizeof (T) 给出数组中 T 类型的两个连续元素地址之间的字节数。所以我们知道对齐要求如我上面所说。 (注)

现在,编译器为 IntFloatAndDoubleStruct 报告了 16。有效果吗?

假设我们在地址对齐到 16 处有这样一个对象。

  • int a 因此在地址 X 处与 16 对齐,所以它与 4 对齐就好了。会占用字节[X, X+4)
  • 这意味着 float c 可以从 X+4 开始,它与 4 对齐,这对 float 来说很好。会占用字节 [X+4, X+8)
  • 最后,double d 可以从 X+8 开始,它与 8 对齐,这对 double 来说很好。会占用字节 [X+8, X+16)
  • 这为下一个结构对象留下了 X+16,再次对齐到 16。

因此没有理由稍后启动任何成员,因此整个结构适合 16 个字节。


(注意) 这不是严格意义上的:对于其中的每一个,我们知道大小和对齐都 <= N,N 是对齐要求的倍数,并且有没有 N1 < N 这也适用。然而,这是一个非常精细的细节,为了清楚起见,答案只是假设原始类型的实际大小和对齐要求是不确定的,无论如何这是 OP 平台上最有可能的情况。

关于c - sizeof(),C 结构中的对齐方式 :,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50815467/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com