分类: C/C++
2017-07-07 15:01:39
C++中没有被调用的静态函数,编译的时候会不会被优化掉呢?
一个同事写C++的代码,在源程序中加了个函数,nm编译后的目标文件发现她加的函数没有被编进去。
在确认了编译路径,宏分支等没有问题后,一时觉得好奇怪。
后面看到她函数前面加了个static属性,我去掉后发现可以编进去了。因此,引发了如题的思考。
确认是这个原因后,就想进一步确认是什么导致个问题,是编译时的优化等级太高还是其他什么的?
开始我以为是O2优化等级导致优化掉的,后面我把优化等级去掉了,仍然被优化掉了。
并且加入-O0确保关闭优化,该函数仍然被优化掉了。后面请教了一个大神,大神说加入__attribute_used__可以防止被优化。
后面查看了gcc的手册,有对该属性的说明
used This attribute, attached to a function, means that code must be emitted for the function even if it appears that the function is not referenced. This is useful, for example, when the function is referenced only in inline assembly.
所以改成如下形式,就不会被优化掉了
所以,和编译等级无关,都会被优化掉的,加 __attribute_used__ 有效可以防止优化。
其实想想是挺好理解的,因为静态函数原本只能本文件中调用,如果本文件中没有调用他,说明这个函数就不会被用到。
优化掉合情合理,编译器还是挺智能的。一般情况大家也很少会遇到这种情况,因为一般定义的函数我们肯定是会调用的。
就不会存在该问题,除非你使用的方式比较隐蔽,连编译器也发现不了,那么就加上上面那个属性,保证编译器不自作主张了。