首页 文章

intel C编译器是否优化了代码中从未调用过的函数?

提问于
浏览
3

只是一些优化考虑因素:

有没有人知道它是否确定intel C编译器(例如ICC 13.0,以及原因,使用某些优化选项编译,如/ O3等)将自动优化代码中的任何未使用/未调用的结构/类/函数/变量,例如examplefun ()如下:

//...defining examplefunc()....//

         const int a=0;
         if (a>0) 
            int b=examplefunc();

2 回答

  • 3

    编译器通常不会优化掉未使用的函数,除非它们是 static ,因此只能在特定模块中访问 . 但是,如果在功能级别而不是模块级别完成链接,则链接器可能会剥离该功能 .

    您可以检查程序集输出,链接器映射,或使用类似objdump的内容来检查该函数是否包含在链接二进制文件中 .

  • 4

    我认为问题没有正确陈述 . 虽然问题从字面上询问编译器是否会优化掉未使用的函数,但这只是链接器可以做的事情 .

    那么编译器可以做什么呢?编译器可以优化掉死代码,例如在上面的代码中,并且因为 a 已知为 0 ,编译器可以完全删除 if 语句 . 对于大多数用途来说,这已经足够了(函数是否使其成为可执行文件不会对性能产生太大影响,是否避免分支会影响函数的性能 - 特别是对于分支错误预测) .

    另外,如果编译器优化了上面的分支,那么程序中对 exampleFunc 函数的引用会少一个,当链接器处理生成的二进制文件时,如果整个程序中没有对函数的引用,它可以删除完全符号 . 请注意,这只能作为程序链接的一部分,对于库,即使现在不调用该函数,稍后与库链接的程序也可以使用它 .

    回到最初的问题,编译器将优化掉分支,链接器可能会或者不会从二进制文件中删除该函数,但这并不重要 .

    关于其他构造,对于 structclass ,唯一使它成为二进制的是成员函数,同样适用于那里:如果你链接程序并且没有使用任何函数,链接器可以删除符号 .

相关问题