也许,我的问题很愚蠢,但我没有找到答案,我真的很想知道。当我们有没有被调用的函数的程序时(例如它们仅为将来的实现而准备)我认为编译器也读取这些行(最小函数声明)。这不是问题,但在更大的项目中表现如何?有没有什么我们应该避免(例如一些分配/包含文件)哪些影响更大?
例如:
//never called/used
class abc{
...
}
//never called/used
float function_A(float x, int y){
...}
int main(){
...
}
这只是一个简短的例子,但我想每个人都知道我的意思。 非常感谢你!
答案 0 :(得分:2)
当前的编译器实现不会为某些函数生成代码,因为您可以阅读here。未使用的代码通常不会影响性能,特别是如果您声明并且未定义函数。只有具有大量说明的功能才会受到影响,但我建议您阅读instruction caching。
在较大的库中,您应该关注包含文件。如果你使用并且(更重要的是)智能地包含它们,你可以在编译时获得性能。即在头文件中使用前向声明,并在cpp文件中包含头。 另一件事是,如果你分成几个头文件,编译器可以在链接时跳过整个.o文件(编译器在编译期间创建),如果它们没有被使用的话。 希望这对你有所帮助
答案 1 :(得分:1)
如果您的意思是应用程序性能,则保留未使用的代码将不会产生任何影响。编译器执行死代码消除。但是不得不经历更多的代码,编译器会稍微减速,所以你需要等待一段时间才能进行程序编译。不包括未使用的头文件是一个好主意,因为一个头文件可以引入数十个或数百个其他头文件。 (但预编译的头文件也可以帮助解决这个问题。)
答案 2 :(得分:1)
如果未删除的死代码会减少整个程序的位置,则指令缓存可能仍然是一个问题。
想象一下两个函数A和B,其中B从A重复调用。如果A和B适合同一个缓存行,则从A调用B不太可能产生缓存未命中。但是如果链接器在两个函数之间放置第三个函数,使得A和B不再位于同一个缓存行上,则调用B时缓存未命中的可能性会降低,从而降低整体执行速度。
虽然效果可能无法很好地衡量并且取决于许多其他因素,但减少死码通常是一个好主意。
答案 3 :(得分:0)
如果编译器可以将其检测为死代码,它将完全删除它并可能会打印警告。如果不是,它将增加目标代码大小。通过静态链接,链接器将删除未使用的函数。