填充是不是曾经添加到这个 C 结构中? [复制]

Posted

技术标签:

【中文标题】填充是不是曾经添加到这个 C 结构中? [复制]【英文标题】:Is padding ever added to this C structure? [duplicate]填充是否曾经添加到这个 C 结构中? [复制] 【发布时间】:2021-04-24 09:37:21 【问题描述】:

如果我将 C 结构定义为,

typedef struct

  double data[2];
 my_struct;

是否有可能将填充添加到这样的结构中?或者我可以安全地假设 sizeof(my_struct) 在所有系统上总是 2*sizeof(double) 吗?

【问题讨论】:

【参考方案1】:

允许编译器实现在字段之间或最终字段之后的结构中添加 any 填充。

在这种情况下可能不会,因为您只有一种数据类型,但不能保证它不会。

如果您需要控制特定于实现的行为,许多实现将为您提供该级别的控制,例如#pragma pack

即使您拥有该级别的控制,您也可以使用标准功能至少在编译时捕获问题(C11 或更高版本):

#include <assert.h>
typedef struct  double data[2];  my_struct;
static_assert(sizeof(my_struct) == sizeof(double) * 2, "I do not like padding");

【讨论】:

以上是关于填充是不是曾经添加到这个 C 结构中? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Java 中将左填充零添加到数字中? [复制]

C++/C#/Java 中“类”的概念是不是来自 C 中的结构? [复制]

从具有父字段的平面列表构造层次结构树? [复制]

FreeRTOS 队列结构 C

结构体变量字节填充

C 结构中的自动字段重新排序以避免填充