C++ 结构在不同的编译时间可以有不同的对齐方式吗?

Can C++ structs have different alignments at different compilation times?

我有一些在低级别工作的代码,曾经与 glm 一起工作。我将 glm 的所有用途切换为 Eigen 我现在观察到一个奇怪的行为,即同一结构似乎在代码的不同点具有不同的对齐方式。

这是 gdb 在初始化后给我的:

(gdb) p sizeof(CellShadingInfo)
 = 240
(gdb) 

下面我们来看具体全局结构的构建:

const std::unordered_map<std::string, size_t> uniform_size_map = {
    {"GuiTransform", sizeof(GuiTransform)},
    {"UniformBufferObject", sizeof(UniformBufferObject)},
    {"GuiVisualProperties", sizeof(GuiVisualProperties)},
    {"PostProcessingEffects", sizeof(PostProcessingEffects)},
    {"LineProperties", sizeof(LineProperties)},
    {"PointInfo", sizeof(PointInfo)},
    {"GaussianVisualization", sizeof(GaussianVisualization)},
    {"ParticleUBO", sizeof(ParticleUBO)},
    {"CameraInfo", sizeof(CameraInfo)},
    {"MVPOnlyUbo", sizeof(MVPOnlyUbo)},
    {"WireframeDebugInfo", sizeof(WireframeDebugInfo)},
    {"CellShadingInfo", sizeof(CellShadingInfo)},
    {"GaussianProperties", sizeof(GaussianProperties)}
};

这是全局的,因此初始化代码应该 运行 在 main 之前。但由于 LUP 已被定义为常量,因此其中的所有值都应该是最终值,从而防止意外覆盖。

但是根据 gdb:

(gdb) p uniform_size_map 
 = std::unordered_map with 13 elements = {["CellShadingInfo"] = 228, ["MVPOnlyUbo"] = 192, ["ParticleUBO"] = 16, 
  ["GaussianVisualization"] = 48, ["PointInfo"] = 36, ["PostProcessingEffects"] = 8, ["GuiVisualProperties"] = 20, 
  ["GaussianProperties"] = 8, ["CameraInfo"] = 12, ["UniformBufferObject"] = 192, ["WireframeDebugInfo"] = 16, 
  ["LineProperties"] = 40, ["GuiTransform"] = 16}

所以我唯一的解释是编译器在编译 preinit 方法和常规 运行time 期间使用了不同的对齐方式。然而,这听起来很荒谬。

问题是编译问题。由于未知原因,目标文件无法编译,因此链接器正在寻找旧的目标文件并链接到它。由于该目标文件是从旧源代码生成的,因此该结构在代码的不同部分不再具有相同的对齐方式。