C++ #pragma包、模板typedefs和结构对齐

C++ #pragma包、模板typedefs和结构对齐,c++,templates,visual-c++,gcc,memory-alignment,C++,Templates,Visual C++,Gcc,Memory Alignment,使用Visual Studio或gcc,如果我有 #pragma pack(push, 16) typedef std::map<uint32_t, uint32_t> MyIntMap; #pragma pack(pop) 此实例的结构对齐方式是什么?也就是说,对于typedef的模板类,pragma包是在typedef处生效还是在变量定义处生效?如果是后者,有什么好的解决方法可以使类型在文件之间保持一致的对齐?在您的代码中,#pragma pack将无效。它只在围绕结构或类

使用Visual Studio或gcc,如果我有

#pragma pack(push, 16)

typedef std::map<uint32_t, uint32_t> MyIntMap;

#pragma pack(pop)
此实例的结构对齐方式是什么?也就是说,对于typedef的模板类,pragma包是在typedef处生效还是在变量定义处生效?如果是后者,有什么好的解决方法可以使类型在文件之间保持一致的对齐?

在您的代码中,
#pragma pack
将无效。它只在围绕结构或类的定义有效时才执行任何操作,而不是围绕typedef或其他任何操作。它对变量定义也没有任何影响

您可以在此处查看用法:

具体而言:

pack在看到pragma后的第一个结构、联合或类声明时生效。pack对定义没有影响


只是出于好奇,那么转发声明呢?那么用这个pragma打包的类及其转发声明呢?我需要在那里重复pragma吗?@arne它对转发声明没有影响,只对类定义有影响。你可以在这里看到我的测试:
#pragma pack(push, 8)

MyIntMap thisInstance;

#pragma pack(pop)