减少内存对齐
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;
}
我想知道是否可以在 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;
}