成员排序和二进制大小

主要观点:在准备C++ On Sea的演讲时,意识到How to keep your binaries small中遗漏了成员排序的重要性;成员变量的顺序会显著影响对象的内存布局和大小,可通过按大小递减顺序排列成员来减少填充字节以节省二进制空间,但并非总是能减少二进制大小,若成员为零初始化则无序也不影响二进制大小,最好为可隐式转换为零的成员使用默认值,其次要注意成员排序以提高缓存友好性。
关键信息:

  • 内存布局中的填充(padding)是为满足平台对齐要求在成员变量间插入的额外字节。
  • 按大小递减顺序排列成员可消除填充并减小结构大小,如将UnoptimalOrder改为OptimalOrder
  • 即使成员顺序改变,若成员零初始化,二进制大小也可能不变;若成员有非零初始值,大小会有显著差异。
    重要细节:
  • 在大多数系统中,4 字节整数需从 4 的倍数地址开始,8 字节double需从 8 的倍数地址开始。
  • 示例中不同顺序的Example类结构大小在零初始化和非零初始化时不同,零初始化时二进制大小相同,非零初始化时大小差异较大。
  • 结尾呼吁点赞、订阅新闻通讯并在 Twitter 上连接,还可成为 Patreon 支持者。
阅读 30
0 条评论