gpt4 book ai didi

c++ - C++ 基本类型的对齐方式和大小

转载 作者:行者123 更新时间:2023-12-02 00:56:30 26 4
gpt4 key购买 nike

在 C++ 中,似乎对于所有整数类型(intlong long intstd::uint16_t、...)对于浮点类型,它始终是 sizeof(T) ==alignof(T)

这个编译器/平台是否特定,或者保证是正确的?是否存在一个平台,其中 int32_t 不需要在 32 位边界上对齐(只要它们不重叠)?

最佳答案

对于基本类型,alignof(T) == sizeof(T)对于大多数现代 ABI 来说都是如此,但不能保证是正确的。 C++ 标准的对齐方式主要由实现定义,仅受以下约束(请参阅 C++11 中的 [basic.align][basic.fundamental]):

  • alignof(T) <= sizeof(T) 。这在标准中并不明确,但数组的元素之间永远不会有任何填充,因此无论 T t[2] 的第一个元素的对齐如何,第二个元素的对齐方式不能大于 sizeof(T) ,因此这是 type T 的最大对齐方式。请注意,变量 的对齐方式可以更大,例如 alignas用于其上。

  • alignof(T) <= alignof(std::max_align_t) ,除非可能存在 alignas 。是否alignas可能导致“过度对齐”(比 max_align_t 更大的粒度)是实现定义的。

  • char , signed char ,和unsigned char都具有相同的对齐要求(即 1,因为 sizeof(char) == 1 根据定义)。

  • 所有无符号整数类型与相应的有符号类型具有相同的对齐要求。

  • wchar_t , char16_t ,和char32_t与其“基础”整数类型具有相同的对齐要求。

历史上存在一些 ABI,其中基本类型与其大小不相符。一个著名的例子是 doublelong double在 80386 的原始 System V ABI 中,尽管分别为 8 字节和 12 字节宽,但仅与 4 字节粒度对齐。这是因为堆栈指针只能保证与 4 字节粒度对齐,而将事件记录中的内容对齐到比堆栈指针更大的粒度是很痛苦的。1

如今, vector 类型可能会出现同样的堆栈对齐问题;例如,在 x86-64 上,堆栈指针保证与 16 字节边界对齐,但硬件现在最多支持 512-bit (64-byte) vectors .

这是我个人所知道的唯一反例。然而,如果得知内存受限嵌入式环境的 ABI 指定了任何对齐(即,alignof(T) == 1 对于所有 T),我不会感到惊讶。 。对于 CPU 来说,处理这个问题并不像以前那么困难,尤其是在不涉及内存虚拟化的情况下。

<小时/>

1 有趣的事实:C++ 标准要求实现具有函数调用堆栈。它需要对递归的支持,并且当抛出异常时会发生一种称为“堆栈展开”的情况,但是所有内容都经过精心编写,以便您可以使用除了我们所使用的线性堆栈之外的其他东西来实现它熟悉。

关于c++ - C++ 基本类型的对齐方式和大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38916722/

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