我想计算/总结由于打包导致的目标文件中的开销(理想情况下,让 gcc 为我最小化它)。
例如,考虑以下结构(32 位 x86,gcc):
struct a {
uint8_t a_char;
uint32_t an_integer
uint8_t another_letter;
};
虽然实际数据只占用 6 个字节,但该结构在内存中占用 12 个字节,因为这两个字符后跟 3 个填充字节。通过重新排序结构如下:
struct b {
uint32_t an_integer
uint8_t a_char;
uint8_t another_letter;
};
该结构将只有 sizeof(struct b) == 8 (仍然是 4 字节的开销)。
(1) 理想情况下,我希望 gcc 重新排列struct a
并struct b
节省空间,但我的版本 (4.2) 似乎没有针对任何优化级别执行此操作。
(2)或者,给定struct a
,我想(自动)获得数字6
(总开销)或4
(最小的开销,如果成员被“理想地”订购)。这样做的目的是确定手动重新排序结构是否值得花时间(可能不值得)。
gcc 有没有办法做(1),有没有可以执行(2)的工具?对于(1),我能想到的最接近的事情是#pragma pack(1)
,但是(我猜)它会通过使大多数/所有内存访问不对齐而产生严重的性能影响。对于(2),我认为解析调试符号的 Perl 脚本可能能够做到这一点,但我对 DWARF 不够熟悉,无法确定。