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

标签 c++ struct compilation alignment padding

我有一些可以在以前与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/

相关文章:

c - 使用结构体 C 编程理解变量

delphi - 如何在Delphi 7中编译SynEdit?

ubuntu - 找不到包裹

c - 选择排序算法(C)

c++ - 是否可以使用 select(2) 来监视 SDL 文本输入事件?

c++ - Windows 上的慢速 std::string 连接

c - 无法正确启动 int 并从函数中保留数字

c - 为什么不能全局定义结构成员?

c++ - 现代编译器优化如何将递归转换为返回常量?

c++ - 使用 C++ CryptAPI :CNG Create CSR