我的问题是为什么 Visual Studio 2012 编译器不自动重新排序结构成员以获得最佳内存利用率?编译器似乎完全按照它们在结构定义中声明的顺序存储成员,并根据成员对齐所需的一些空填充。在可能的情况下,重新排序似乎是比填充更可取的对齐成员的方式。是否有理由必须按声明顺序将其存储在内存中?
相关细节如下;
我有一个结构,它代表一个大数组中的单个元素。该元素有许多成员,一些是 32 位的,一些是 64 位的。我已调整默认结构成员对齐以获得最佳性能。
我在调试模式下探索内存,发现有很大一部分内存被浪费了。我将问题跟踪到 stuct 成员如何在内存中对齐。我知道 32 位成员必须在 DWORD 边界上对齐以获得最佳性能,显然 64 位成员必须在 QWORD 边界上对齐(我原以为 DWORD 边界就足够了)
我可以通过更改在结构定义中列出成员的顺序来解决问题。我确保尽可能连续放置 2 个 32 位成员,以便在 QWORD 边界上启动下一个 64 位成员不需要填充。