我有一些可以在以前与glm
一起工作的底层代码。我将glm
的所有使用都切换为Eigen
,现在我观察到一个奇怪的行为,其中同一结构在代码中的不同点似乎具有不同的对齐方式。
这是gdb在初始化后给我的:
(gdb) p sizeof(CellShadingInfo)
$1 = 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
$2 = 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方法与常规运行时期间,编译器使用了不同的对齐方式。但是,这听起来很荒谬。
最佳答案
问题是编译问题。由于未知的原因,目标文件无法编译,因此链接程序找到了旧的目标文件并针对该目标文件进行了链接。由于该目标文件是由旧的源代码制成的,因此该结构在代码的不同部分不再具有相同的对齐方式。
关于c++ - C++结构在不同的编译时间可以具有不同的对齐方式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63222579/