在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();
答案 0 :(得分:2)
您的方法生成代码。那段代码将存在于某个地方。构建可执行文件时,它可能存在于您的可执行文件中。这将增加可执行文件的大小,增加其加载时间并可能影响其缓存行为。所以答案是肯定的。
除了......它变得更加泥泞。
一个好的编译器和一个好的链接器可以交互,这样你实际上不使用的任何代码都不会内置到你的可执行文件中。其粒度各不相同,但可以一直到单个功能(在某些语言中甚至可能更低)。如果编译器可以发信号通知实际上没有调用相关方法,并且链接器足够智能以在函数级别引入代码,那么答案将变为“否”。
因此,简而言之,答案是“是”或“否”,这取决于您将要研究的与您正在使用的工具以及您正在运行的平台相关的众多因素。
答案 1 :(得分:2)
可执行文件中通常存在未使用的方法,除非您告诉链接器找到它们并将其删除。
例如,在Mac上,您可以将-dead_strip
传递给ld
以删除此类死代码。如果您使用的是Visual C ++,则可以将/OPT:REF
传递给link.exe
(我想Visual Studio会自动将您的项目设置为在Release版本中传递此选项,但不会在Debug版本中传递。)< / p>
答案 2 :(得分:2)
请注意,大多数操作系统并不总是将所有代码保留在内存中。由于代码是常量数据,操作系统总是可以按需从文件中加载,就像从交换中加载动态数据一样。但这并不意味着永远不会加载未使用的代码,因为操作系统不是通过单独的方法而是通过页面加载它。换句话说,除非您非常了解您的操作系统和代码段的结构,否则很难预测代码段的哪些部分实际上会在内存中结束。唯一可以肯定的是,你的代码完全可能比实际大小消耗更少的物理内存。
至于执行速度,我认为答案是否定的。它可能会增加应用程序加载速度,但是当代码执行时,没有人关心它有多大,它对速度完全没有影响。也就是说,除非你接近你的内存限制并且操作系统开始交换很多而且一切都变得很慢。
正如其他人已经提到的,编译器可能会优化您的代码。但是,您也可以使用#ifdefs作为调试方法,并且通常建议您这样做。
答案 3 :(得分:0)
确定代码是否未使用是一个相当难的问题。只需编写一个hello world程序,将其与glibc静态链接,并使用objdump
查看最终存在于二进制文件中的所有垃圾。绝大多数此代码不是使用,但它的引用方式使编译器或链接器难以或无法对其进行优化。除非作为图书馆作者,你努力工作以避免引入这种依赖,否则未使用的函数/方法将浪费空间,可能还有很多。我怀疑它在C ++中比在C中更难。