我想知道是否有可能"减少";C++中数据类型的对齐。例如,int
的排列是4;我想知道是否可以将int
的对齐设置为1或2。我尝试使用alignas
关键字,但似乎不起作用。
我想知道这是我的编译器没有做到的,还是C++标准不允许这样做;无论哪种情况,我都想知道为什么会这样。
我想知道是否有可能"减少";C++中数据类型的对齐
这是不可能的。根据本C++标准草案:
10.6.2对齐说明符[dcl.aligent]
…
5所有声明中的对齐说明符不应指定对齐这比如果所有属于实体的对齐说明符实体被省略。
这样做的"原因"是,在大多数情况下,对齐要求是由目标硬件决定的:如果给定的CPU要求将int
存储在4字节对齐的地址中,那么,如果允许编译器生成将这样的int
放在不太严格对齐的内存位置的代码,程序运行时会导致硬件故障。(请注意,在某些平台上,int
的对齐要求仅为1字节,即使在更严格地对齐时,访问可能会被优化。(
一些编译器可能会提供出现的方式,以减少对齐;例如,MSVC具有__declspec(align(#))
扩展,它可以应用于typedef
语句中。但是,从文档来看:__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;
}