如果已知结构构件的对齐,是否可以找到结构类型的对齐?
例如.对于:
struct S
{
a_t a;
b_t b;
c_t c[];
};
Run Code Online (Sandbox Code Playgroud)
是S = max(alignment_of(a),alignment_of(b),alignment_of(c))的对齐?
在网上搜索我发现"对于结构化类型,其任何元素的最大对齐要求决定了结构的对齐"(在每个程序员应该知道的内存中)但我在标准中找不到任何类似的东西(最新草稿更准确).
编辑:
非常感谢所有的答案,特别是罗伯特·甘博为原始问题提供了一个非常好的答案,以及其他贡献者.
简而言之:
为了确保结构构件的对准要求,结构的对准必须至少与其最严格构件的对准一样严格.
至于确定结构的对齐方式,我们提出了一些选项,经过一些研究,我发现了这个:
- c ++ std :: tr1 :: alignment_of
- 尚未标准,但关闭(技术报告1),应该在C++ 0x中
- 最新草案中存在以下限制:前提条件:T应为完整类型,引用类型或未知范围的数组,但不应为函数类型或(可能是cv-qualified)void.
- 这意味着我提出的使用C99灵活数组的用例将无法工作(这并不奇怪,因为灵活的数组不是标准的c ++)
- 在最新的c ++草案中,它是用新关键字的术语定义的 - alignas(具有相同的完整类型要求)
- 在我看来,如果c ++标准曾经支持C99灵活数组,那么要求可以放宽(结构与灵活数组的对齐不应该根据数组元素的数量而改变)
- c ++ boost :: alignment_of
- 主要是tr1替代品
- 似乎是专门针对void而在这种情况下返回0(这在c ++草案中是禁止的)
- 来自开发人员的注意事项:严格来说,您应该只依赖于ALIGNOF(T)的值是T的真实对齐的倍数,尽管在实践中它确实在我们所知道的所有情况下计算了正确的值.
- 我不知道这是否适用于灵活的数组,它应该(可能不起作用,这解决了我的平台上的编译器内在因此我不知道它将如何在一般情况下表现)
- Andrew Top提出了一个简单的模板解决方案,用于计算答案中的对齐方式
- 这似乎与boost正在做的非常接近(如果它小于计算的对齐,则boost会另外返回对象大小,因为我可以看到相同的通知
- 这适用于灵活的数组
- 使用Windbg.exe找出符号的对齐方式
- 在包含该类型的匿名结构上使用offsetof
- 编译器内在函数,例如.MSVC __alignof
- 适用于灵活的数组
- alignof关键字在最新的c ++草案中
如果我们想要使用"标准"解决方案,我们只限于std :: tr1 :: alignment_of,但如果你将c ++代码与c99的灵活数组混合,这将不起作用.
我认为它只有一个解决方案 - 使用旧的struct hack:
struct S
{
a_t a; …
Run Code Online (Sandbox Code Playgroud)