gpt4 book ai didi

c++ - 是否有符合标准的方法来确定非静态成员的对齐方式?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:38:28 24 4
gpt4 key购买 nike

假设我有一些结构 S 和一个非静态成员 member,如本例所示:

struct S { alignas(alignof(void *)) char member[sizeof(void *)]; };

如何获取member的对齐方式?

运算符alignof 只能应用于完整类型,不能应用于表达式[ in 7.6.2.5.1 ],虽然 GCC 允许,所以 alignof(S::member) 和 Clang 支持它。

没有此限制的“语言律师”标准方法是什么?

此外,sizeof 允许表达式参数,是否有不对称的原因?

实际问题是能够获取模板结构成员的对齐方式,您可以执行 decltype 获取它们的类型,sizeof 获取它们的大小,但是那么你还需要对齐。

最佳答案

类型或变量的对齐是对变量可以驻留的内存地址的描述——地址必须是对齐的倍数*。但是,对于数据成员,数据成员的地址可以是任何K * alignof(S) + offsetof(S, member)。让我们将数据成员的对齐方式定义为最大可能的整数 E,这样 &some_s.member 始终是 E 的倍数。

给定一个类型 S 和成员 member,让 A = alignof(S), O = offsetof(S, member)。< br/>S{}.member 的有效地址是 V = K * A + O 对于某个整数 K
V = K * A + O = gcd(A, O) * (K * A/gcd(A, O) + O/gcd(A, O))
对于 K = 1 的情况,不存在其他因素。
因此,gcd(A, O) 是对未知 K 有效的最佳因子。

换句话说,"alignof(S.member)"== gcd(alignof(S), offsetof(S, member))

请注意,此对齐始终是二的幂,因为 alignof(S) 始终是二的幂。

*:在我对标准的短暂尝试中,我找不到这个保证,这意味着变量的地址可能K * alignment + some_integer。但是,这并不影响最终结果。


我们可以定义一个宏来计算数据成员的对齐方式:

#include <cstddef> // for offsetof(...)
#include <numeric> // for std::gcd

// Must be a macro, as `offsetof` is a macro because the member name must be known
// at preprocessing time.
#define ALIGNOF_MEMBER(cls, member) (::std::gcd(alignof(cls), offsetof(cls, member)))

这只保证对标准布局类型有效,如offsetof is only guaranteed valid for standard layout types .如果类不是标准布局,则有条件地支持该操作。

例子:

#include <cstddef>
#include <numeric>

struct S1 { char foo; alignas(alignof(void *)) char member[sizeof(void *)]; };
struct S2 { char foo; char member[sizeof(void *)]; };

#define ALIGNOF_MEMBER(cls, member) (::std::gcd(alignof(cls), offsetof(cls, member)))

int f1() { return ALIGNOF_MEMBER(S1, member); } // returns alignof(void *) == 8
int f2() { return ALIGNOF_MEMBER(S1, foo); } // returns 8*
int f3() { return ALIGNOF_MEMBER(S2, member); } // returns 1

// *: alignof(S1) == 8, so the `foo` member must always be at an alignment of 8

Compiler Explorer

关于c++ - 是否有符合标准的方法来确定非静态成员的对齐方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56861548/

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