C 结构的“alignof”是否总是其组成部分的最大“alignof”?

C 结构的“alignof”是否总是其组成部分的最大“alignof”?,c,C,通过简单的示例,我注意到alignof(struct\u name)始终是其结构成分的最大alignof的alignof。情况总是这样(或几乎总是这样) 结构的alignof是否始终是其组成部分的最大alignof alignof宏扩展为\u alignof运算符,该运算符计算其操作数的对齐要求。如何确定对齐需求的大多数方面都是实现定义的,因此从这个意义上说,假设您的主张始终或甚至通常成立是不安全的 然而,您观察到的模式是常见的。为了实现确保给定结构类型的每个实例的每个构件都按照该构件类型的对齐

通过简单的示例,我注意到
alignof(struct\u name)
始终是其结构成分的最大
alignof
alignof
。情况总是这样(或几乎总是这样)

结构的
alignof
是否始终是其组成部分的最大
alignof

alignof
宏扩展为
\u alignof
运算符,该运算符计算其操作数的对齐要求。如何确定对齐需求的大多数方面都是实现定义的,因此从这个意义上说,假设您的主张始终或甚至通常成立是不安全的

然而,您观察到的模式是常见的。为了实现确保给定结构类型的每个实例的每个构件都按照该构件类型的对齐要求对齐,实施必须为整体结构类型选择至少与其任何构件的最大对齐要求一样大的对齐要求。另一方面,选择尽可能小的对齐要求有助于高效使用内存。这些因素的组合将导致您观察到的对齐行为

但是,我重申,对齐要求在很大程度上是由实现定义的。即使不考虑
\u Alignas
操作符的影响,实现也没有义务根据您的模式选择结构对齐要求。例如,实现可以选择(至少)为每个结构类型指定最大基本对齐,而不管其成员类型如何


然而,最终,人们不得不想知道你为什么在乎。您需要知道或应该依赖于您的类型的对齐要求,这是很少见的,尽管并非闻所未闻。如果您确实想要一个特定的对齐要求,那么直接声明它要比试图使用成员的类型来影响它要好得多。

几乎总是-肯定的。始终-如果有人表现出热情并指定了比需要更严格(更大)的值,则可能不会。我保留对这是否意味着
alignof
alignas
相同的判断。这样做肯定有充分的理由。对齐缓存线边界,对齐SIMD指令,……我想我听说过所有4字节结构都有align 4的系统,即使它们的成员都是align 1。为什么实现通常为整个结构类型选择一个至少与其任何成员的最大对齐要求一样大的对齐要求?@Linh,假设一个结构有一个具有64位对齐要求的成员,但该结构本身被归因于32位对齐要求。然后,结构可以启动的地址数是成员可以启动的地址数的两倍。因此,结构起始地址的一半(至少)必然会导致构件未对齐。我同意结构的对齐要求必须至少等于其构件的最大对齐要求。由于对齐要求是连续地址之间的字节数,在这些地址上可以分配这种类型的对象,因此,我认为结构的对齐要求至少应该等于结构大小。这样结构的对象就不会彼此重叠。@Linh,如果结构类型的对齐要求等于其大小,则该类型的有意义的不同对象就永远不会重叠,但这既不是对齐要求的目的,也不是对齐要求的常见用途。没有必要确保相同类型的对象不重叠,而且在实践中,没有编译器采用一种通用规则,即所有结构类型的对齐要求都等于它们的大小。对齐要求完全与数据对齐有关。也就是说,在内存中布局对象以实现高效访问。@Linh,这不仅仅是一条一般规则,而是对每个类型的对齐要求的一个实际要求,即均匀划分其大小。否则,如果某些元素未对齐,则无法形成该类型对象的数组。这是某些结构使用未命名填充物布局的原因之一。