Могут ли структуры C ++ иметь разное выравнивание в разное время компиляции? - PullRequest
1 голос
/ 03 августа 2020

У меня был код, работающий на низком уровне, который раньше работал с 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 по сравнению с обычным временем выполнения. Однако это звучит нелепо.

1 Ответ

0 голосов
/ 03 августа 2020

Проблема заключалась в проблеме компиляции. По неизвестным причинам объектный файл не скомпилировался, в результате компоновщик находил старый объектный файл и связывал его. Поскольку этот объектный файл был создан из старого исходного кода, структура больше не имела одинакового выравнивания в разных частях кода.

...