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