未执行代码的性能

时间:2014-09-03 07:52:44

标签: c++ performance optimization

也许,我的问题很愚蠢,但我没有找到答案,我真的很想知道。当我们有没有被调用的函数的程序时(例如它们仅为将来的实现而准备)我认为编译器也读取这些行(最小函数声明)。这不是问题,但在更大的项目中表现如何?有没有什么我们应该避免(例如一些分配/包含文件)哪些影响更大?

例如:

//never called/used
class abc{
...
}

//never called/used
float function_A(float x, int y){

...}

int main(){
...
}

这只是一个简短的例子,但我想每个人都知道我的意思。 非常感谢你!

4 个答案:

答案 0 :(得分:2)

当前的编译器实现不会为某些函数生成代码,因为您可以阅读here。未使用的代码通常不会影响性能,特别是如果您声明并且未定义函数。只有具有大量说明的功能才会受到影响,但我建议您阅读instruction caching

在较大的库中,您应该关注包含文件。如果你使用并且(更重要的是)智能地包含它们,你可以在编译时获得性能。即在头文件中使用前向声明,并在cpp文件中包含头。 另一件事是,如果你分成几个头文件,编译器可以在链接时跳过整个.o文件(编译器在编译期间创建),如果它们没有被使用的话。 希望这对你有所帮助

答案 1 :(得分:1)

如果您的意思是应用程序性能,则保留未使用的代码将不会产生任何影响。编译器执行死代码消除。但是不得不经历更多的代码,编译器会稍微减速,所以你需要等待一段时间才能进行程序编译。不包括未使用的头文件是一个好主意,因为一个头文件可以引入数十个或数百个其他头文件。 (但预编译的头文件也可以帮助解决这个问题。)

答案 2 :(得分:1)

如果未删除的死代码会减少整个程序的位置,则指令缓存可能仍然是一个问题。

想象一下两个函数A和B,其中B从A重复调用。如果A和B适合同一个缓存行,则从A调用B不太可能产生缓存未命中。但是如果链接器在两个函数之间放置第三个函数,使得A和B不再位于同一个缓存行上,则调用B时缓存未命中的可能性会降低,从而降低整体执行速度。

虽然效果可能无法很好地衡量并且取决于许多其他因素,但减少死码通常是一个好主意。

答案 3 :(得分:0)

如果编译器可以将其检测为死代码,它将完全删除它并可能会打印警告。如果不是,它将增加目标代码大小。通过静态链接,链接器将删除未使用的函数。