我正在研究一个内存严格限制的微控制器。因此,我观察内存消耗。
我有一些库只有在cpp文件中可见的类。这些类不会显示在头文件中。这些课程直接实施。现在我开始将声明与实现分开。关键是我需要在头文件中公开它们中的一些。但是我注意到这种分离会影响程序的大小。对于某些类,它会增加某些类的内存消耗,从而减少它。
为什么定义和实现的分离会影响编译的程序大小?我如何利用它来减少编译的程序大小?
答案 0 :(得分:1)
当一个类仅在单个翻译单元(文件)中使用时,编译器可以自由地执行它喜欢的任何优化。它可以完全摆脱v-table,将类拆分并将其转换为更加程序化的结构,如果这样做效果更好的话。当您将类导出到外部时,编译器无法假设谁可能正在使用它,因此它可以执行的优化更加有限。
然而,特别是在微控制器上,有许多积极的后链接器优化,例如可能会在完成的程序上减少代码大小的过程抽象。有时,如果编译器由于上述情况而对较少的单独模块进行了优化,则可以在此阶段实现更大的增益,因为存在更多未经优化的重复代码块。
现在额外的内存非常便宜,很少值得尝试编写程序来节省几个字节。拥有更清晰,更易于维护的代码库将在第一次实例中快速支付任何BOM节省,您必须添加新功能。如果你真的想要仔细控制内存使用,那么我建议你转移到C(或者是一个非常有限的C ++子集),并且非常了解编译器的优化方式。