gpt4 book ai didi

c++ - 删除 C 结构结尾填充的最佳做法是什么?

转载 作者:太空狗 更新时间:2023-10-29 21:26:14 26 4
gpt4 key购买 nike

在 C 或 C++ 中制作非压缩非填充结构的最佳方法是什么?目标是:

typedef struct {
char first[3]; //padded to 8 because next type has size 8
double second;
char third;
} SomeStruct;

but do something to make sizeof(SomeStruct) be equal 17;

结构由外部库规范定义。我有两个决定:

1)

#pragma pack (push, 1)

typedef struct {
char first[3];
char unused[5]; // Manual padding of second field.
double second;
char third;
} SomeStruct;

#pragma pack (pop)

2) 使用声明的第一个变体,但编写 (int)(&((SomeStruct*)0)->third) + sizeof(((SomeStruct*)0)->third) 而不是 sizeof(SomeStruct) 序列化数据时。我不需要序列化此类结构的数组,所以可以这样做。

但它们都是肮脏的黑客。在 C 语言中是否有删除结构填充的标准方法?

最佳答案

C11 现在有 _Alignas 关键字,可以建议您的 double

更窄的对齐方式
typedef struct {
char first[3]; //padded to 8 because next type has size 8
_Alignas(uint16_t) double second;
char third;
} SomeStruct;

只要有可能,这就会进行更窄的对齐,也就是说,如果您平台上的 double 的标准运算符能够处理这样的对齐。 (否则你就完蛋了。)

Clang 已经实现了该功能,并且其他编译器(例如 gcc)已经具有接近它的扩展,因此您可以轻松地为自己编写一个使用此语法且“面向 future ”的包装器。

编辑:我发帖后才看到您的问题也是关于 C++ 的。我认为 C++1 具有与 alignas 相同的特性。 (C11 通过标准头文件中的宏具有 alignas -> _Alignas。)

关于c++ - 删除 C 结构结尾填充的最佳做法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12191297/

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