gpt4 book ai didi

c++ - 为什么结构体的 sizeof 不等于每个成员的 sizeof 之和?

转载 作者:行者123 更新时间:2023-11-30 16:18:11 34 4
gpt4 key购买 nike

为什么 sizeof 运算符返回的结构大小大于该结构成员的总大小?

最佳答案

这是因为添加了填充以满足对齐约束。 Data structure alignment影响程序的性能和正确性:

  • 未对齐的访问可能是一个硬错误(通常是 SIGBUS)。
  • 未对齐的访问可能是软错误。
    • 通过硬件进行纠正,以实现适度的性能下降。
    • 或者通过软件仿真进行纠正,以解决严重的性能下降问题。
    • 此外,原子性和其他并发保证可能会被破坏,从而导致细微的错误。

以下是使用 x86 处理器典型设置的示例(全部使用 32 位和 64 位模式):

struct X
{
short s; /* 2 bytes */
/* 2 padding bytes */
int i; /* 4 bytes */
char c; /* 1 byte */
/* 3 padding bytes */
};

struct Y
{
int i; /* 4 bytes */
char c; /* 1 byte */
/* 1 padding byte */
short s; /* 2 bytes */
};

struct Z
{
int i; /* 4 bytes */
short s; /* 2 bytes */
char c; /* 1 byte */
/* 1 padding byte */
};

const int sizeX = sizeof(struct X); /* = 12 */
const int sizeY = sizeof(struct Y); /* = 8 */
const int sizeZ = sizeof(struct Z); /* = 8 */

可以通过按对齐方式对成员进行排序(按大小排序足以满足基本类型的要求)来最小化结构的大小(如上例中的结构 Z)。

重要提示:C 和 C++ 标准都规定结构对齐是实现定义的。因此,每个编译器可能会选择以不同的方式对齐数据,从而导致不同且不兼容的数据布局。因此,在处理不同编译器将使用的库时,了解编译器如何对齐数据非常重要。某些编译器具有命令行设置和/或特殊的 #pragma 语句来更改结构对齐设置。

关于c++ - 为什么结构体的 sizeof 不等于每个成员的 sizeof 之和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56028081/

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