额外的函数/方法定义会增加程序的内存占用吗?

Posted

技术标签:

【中文标题】额外的函数/方法定义会增加程序的内存占用吗?【英文标题】:Do additional function/method definitions increase a program's memory footprint? 【发布时间】:2010-12-15 05:36:08 【问题描述】:

在 C++ 中,定义未使用的附加方法或函数是否会导致更大的内存占用或更慢的执行速度?

基本上,我在一个类中有几个实用程序调试方法,这些方法都不是该类的正常使用所必需的。如果这些定义从未使用过,它们是否会在内存占用或速度方面有所不同?例如:

class myClass

    public:

        //Something the user of this class would use
        int doSomething() ...

        //Something used solely to make sure I wrote the class properly
        bool isClassValid() ...
;

...

myClass classInstance();
myClass.doSomething();

【问题讨论】:

Windows,但这个问题适用于任何平台。 这个问题适用于任何平台,是的。答案因平台而异。在内存管理方式和应用程序结构方面,嵌入式 RMX 将与大型机操作系统大不相同。 【参考方案1】:

请注意,大多数操作系统并不总是将所有代码都保存在内存中。由于代码是常量数据,操作系统总是可以按需从文件中加载它,就像从交换中加载动态数据一样。但这并不意味着永远不会加载未使用的代码,因为操作系统不是通过单独的方法而是通过页面加载它。换句话说,除非您对操作系统和代码段的结构有非常深入的了解,否则很难预测代码段的哪些部分最终会进入内存。唯一可以肯定的是,您的代码完全有可能消耗的物理内存少于其实际大小。

至于执行速度,我认为答案是否定的。它可能会提高应用程序的加载速度,但是当代码执行时,没人关心它有多大,它对速度绝对没有影响。也就是说,除非您接近内存限制并且操作系统开始大量交换并且一切都变得非常缓慢。

正如其他人已经提到的,编译器可能会优化您的代码。但这也是您可以通过使用#ifdefs 作为调试方法自己完成的事情,通常建议您这样做。

【讨论】:

如果您的可执行文件太大,也会影响缓存性能。【参考方案2】:

您的方法生成代码。该代码将存在于某个地方。当您的可执行文件被构建时,它可能会存在于您的可执行文件中。这将增加可执行文件的大小,增加其加载时间并可能影响其缓存行为。所以答案是“是”。

除了……它变得更糊了。

一个好的编译器和一个好的链接器可以交互,这样你实际上不使用的任何代码都不会被内置到你的可执行文件中。其粒度各不相同,但可以一直延伸到单个函数(在某些语言中甚至可能更低)。如果编译器可以发出信号表明所讨论的方法实际上从未被调用,并且链接器足够聪明,可以在函数级别引入代码,那么答案将变为“否”。

因此,简而言之,答案是“是”或“否”,具体取决于您必须研究的大量因素,这些因素与您使用的工具和运行的平台相关。

【讨论】:

您可以随时比较两个 .exe 文件的大小,有无额外功能。【参考方案3】:

未使用的方法通常存在于可执行文件中,除非您告诉链接器找到它们并将它们删除。

例如,在 Mac 上,您可以将 -dead_strip 传递给 ld 以去除此类死代码。如果您在 Windows 上使用 Visual C++,则可以将 /OPT:REF 传递给 link.exe(我想 Visual Studio 会自动设置您的项目以在发布版本中传递此选项,但在调试版本中不传递。)

【讨论】:

【参考方案4】:

确定代码是否未被使用是一个相当困难的问题。只需编写一个 hello world 程序,将其与 glibc 静态链接,然后使用 objdump 查看二进制文件中的所有垃圾。绝大多数代码没有使用,但它的引用方式使得编译器或链接器难以或不可能对其进行优化。除非作为库作者,您非常努力地避免引入这种依赖关系,否则未使用的函数/方法浪费空间,而且可能会浪费很多空间。我怀疑 C++ 比 C 更难。

【讨论】:

以上是关于额外的函数/方法定义会增加程序的内存占用吗?的主要内容,如果未能解决你的问题,请参考以下文章

C++程序,内存占用一直增加,最后无法分配内存而中断

内存管理

内存管理简介

java中成员函数占用对象的内存空间吗

在 PHP 中使用静态方法和属性会占用更少的内存吗?

java中怎么判断arraylist占用的内存空间大小