У меня был код, работающий на низком уровне, который раньше работал с glm
. Я переключил все варианты использования glm
на Eigen
. И теперь я наблюдаю странное поведение, когда одна и та же структура, кажется, имеет разное выравнивание в разных точках кода.
Это то, что дает мне gdb после инициализации :
(gdb) p sizeof(CellShadingInfo)
$1 = 240
(gdb)
Теперь давайте посмотрим, как создается специфицированная c глобальная структура:
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 по сравнению с обычным временем выполнения. Однако это звучит нелепо.