Jac*_*cob 3 c c++ gcc packing alignment
由于打包,我想计算/总结一个目标文件的开销(理想情况下,让gcc最小化它).
例如,考虑以下结构(32位x86,gcc):
struct a {
uint8_t a_char;
uint32_t an_integer
uint8_t another_letter;
};
Run Code Online (Sandbox Code Playgroud)
虽然实际数据只占用6个字节,但该结构在内存中占用12个字节,因为两个字符后跟3个填充字节.通过重新排序结构如下:
struct b {
uint32_t an_integer
uint8_t a_char;
uint8_t another_letter;
};
Run Code Online (Sandbox Code Playgroud)
该结构只有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不太熟悉,无法确切知道.
对于#1,未完成的原因是C和C++标准都禁止结构成员重新排序.
是的,结构打包通常会降低性能.并且,正如评论中所提到的,在非x86架构的某些情况下,如果您尝试对成员进行操作,则可以获得SIGBUS.
对于#2,是的perl脚本可能能够做到这一点.您可以尝试扫描结构定义的源代码,而不是解析DWARF信息,也可以生成一些小的测试程序来检查结构和成员的sizeof()等等.
| 归档时间: |
|
| 查看次数: |
462 次 |
| 最近记录: |