gpt4 book ai didi

我们可以使用 static_assert 来检测结构中的填充吗?

转载 作者:行者123 更新时间:2023-12-02 08:09:57 25 4
gpt4 key购买 nike

这是另一个 question 的后续内容

我试图在编译时确定特定实现是否在结构中添加了未命名的填充。像 gcc 这样的特定实现允许使用编译指示来控制结构中的填充和对齐,但代价是与其他实现兼容。由于 C11 的 n1570 草案同时要求 static_assertoffset_of,我想使用它们来查看实现是否使用了成员之间的填充。

这是代码的相关部分(引用问题中的完整代码):

#include <stdio.h>
#include <stddef.h>
#include <assert.h>

struct quad {
int x;
int y;
int z;
int t;
};

int main() {
// ensure members are consecutive (note 1)
static_assert(offsetof(struct quad, t) == 3 * sizeof(int),
"unexpected padding in quad struct");
struct quad q;
...

正如 6.7.2.1 结构和 union 说明符 § 15 所说:

Within a structure object, the non-bit-field members and the units in which bit-fields reside have addresses that increase in the order in which they are declared. A pointer to a structure object, suitably converted, points to its initial member (or if that member is a bit-field, then to the unit in which it resides), and vice versa. There may be unnamed padding within a structure object, but not at its beginning.

我假设如果结构中元素的偏移量是在它之前声明的元素大小的总和,那么这些元素之间不能存在填充,它们应该被连续分配,因此如果它们是同类型。

问题是:上面的假设是错误的吗(对引用问题的评论让我们想想)为什么?

最佳答案

理论上可能在 t 之后的结构末尾有填充,您的断言没有捕捉到(这可能是也可能不是有意的)。您的假设在其他方面是正确的,这是完美地使用 offsetofstatic_assert 来检测成员变量之间任何位置的填充。

更好的选择可能是:

static_assert( offsetof(struct quad, t) == sizeof(struct quad)-sizeof(int),

这也捕获了结构末尾的填充。此外,它使断言更加灵活,以防在代码维护期间更改结构成员。

关于我们可以使用 static_assert 来检测结构中的填充吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48148477/

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