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 期间使用了不同的对齐方式。然而,这听起来很荒谬。
问题是编译问题。由于未知原因,目标文件无法编译,因此链接器正在寻找旧的目标文件并链接到它。由于该目标文件是从旧源代码生成的,因此该结构在代码的不同部分不再具有相同的对齐方式。
我有一些在低级别工作的代码,曾经与 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 期间使用了不同的对齐方式。然而,这听起来很荒谬。
问题是编译问题。由于未知原因,目标文件无法编译,因此链接器正在寻找旧的目标文件并链接到它。由于该目标文件是从旧源代码生成的,因此该结构在代码的不同部分不再具有相同的对齐方式。