gpt4 book ai didi

c - 为什么结构成员不根据结构中最大的数据成员对齐?

转载 作者:行者123 更新时间:2023-12-01 16:38:20 25 4
gpt4 key购买 nike

我读到在结构中,成员根据结构中最大的数据成员对齐。但它似乎不起作用。

#include <stdio.h>

struct abc
{
char a[10];
int b;
float f;
double d;
char c;
};

main()
{
printf("size : %d", sizeof(struct abc));
printf("size of double : %d", sizeof(double));
}

结构大小打印为 32 字节。但我预计它会将 40 打印为 a(10) + 2 个填充字节 + b(4) + f(4) + 4 个填充字节 + d(8) + c(1) + 7 个填充字节。任何人都可以告诉我为什么这没有按预期工作吗?

最佳答案

C 结构根据最严格对齐 数据成员对齐,它可能是也可能不是最大的成员。 (在您的示例中,最大的成员是 char a[10],其大小为 10 但其对齐仅为 1。)

精确对齐约束依赖于实现;该标准提供的唯一要求是所有对齐方式都是 2 的幂。

对象的对齐方式不需要与其大小相同。例如,在运行 Posix(类)系统的 32 位 Intel 平台上,没有原始类型的对齐超过四个字节,包括八字节 double 和 10 字节长 double (如果由 C 编译器实现)。但是其他平台 ABI 需要 8 字节对齐的 double ,这使得 long doubles 的大小为 16 字节而不是 12 字节(尽管在所有情况下,硬件仅使用 80 位。)

大量平台和 CPU 相关的详细信息包含在称为“应用程序二进制接口(interface)”(ABI) 规范的文档中。这些规范通常不是标准,因为它们没有被国际标准机构认可,但它们通常受到尊重,以允许不同编译器、链接器和系统库之间的互操作性。您可以在 Linux Foundation's Referenced Specifications page 上找到其中一些与 Linux 实现相关的规范列表。 .特别是,指定 i386 硬件上基本类型对齐的文档是 "System V Application Binary Interface Intel386 Architecture Processor Supplement, Fourth Edition" (一个 377 页的 PDF 文件,需要与 System V 应用程序二进制接口(interface)基础文档一起阅读,另外还有 271 页。)您将在第 28 页找到图表。

关于c - 为什么结构成员不根据结构中最大的数据成员对齐?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25945625/

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