减少内存对齐

Reducing memory alignment

我想知道是否可以在 C++ 中“减少”数据类型的对齐方式。比如int的对齐是4;我想知道是否可以将 int 的对齐设置为 1 或 2。我尝试使用 alignas 关键字但它似乎不起作用。

我想知道这是我的编译器没有做的事情还是 C++ 标准不允许这样做;对于这两种情况,我都想知道为什么会这样。

我想知道是否可以在 C++ 中“减少”数据类型的对齐方式。

这是不可能的。来自 this Draft C++ Standard:

10.6.2 Alignment specifier      [dcl.align]


5     The combined effect of all alignment-specifiers in a declaration shall not specify an alignment that is less strict than the alignment that would be required for the entity being declared if all alignment-specifiers appertaining to that entity were omitted.

'reason' 在大多数情况下,对齐要求由目标硬件决定:如果给定 CPU 要求 int 存储在 4-byte-aligned 地址中,然后,如果允许编译器生成将这样的 int 放入的代码对齐不太严格的内存位置,当 运行 时,程序会导致硬件故障。 (请注意,在某些平台上,int 的对齐 requirement 仅为 1 个字节,即使访问可能 optimized更严格对齐。)


一些编译器可能会提供出现的方式来减少对齐;例如,MSVC 具有 __declspec(align(#)) 扩展名,可以在 typedef 语句中应用。但是从the documentation:__declspec(align(#))只能增加对齐限制:

#include <iostream>
typedef __declspec(align(1)) int MyInt; // No compiler error, but...
int main()
{
    std::cout << alignof(int) << "\n";   // "4"
    std::cout << alignof(MyInt) << "\n"; // "4" ...doesn't reduce the aligment requirement
    return 0;
}