自己写的而且没被调用的函数(注意不包括没有specialized的模板),如果不是inline或static,都会被编译,因为编译分两步,首先每个translation unit都会被编译为o file,然后所有o file会被链接成目标文件。而目标文件不一定是可执行程序,也可以是动态链接库,这个时候那些没被用过的函数当然要留下,因为如果是动态链接库那么它在未来任何时候都有可能被另一个程序链接,所以无法判断一个函数是否真的不会再被使用。如果是inline或者static,不用的就会被删除,毕竟在其他translation unit里都不可见,所以删除了不会有任何副作用
实验表明,gcc无论开O3还是Os都不会在最终的可执行程序中删除没被使用的函数。不过,链接器的确有个选项可以删除可执行文件中没被使用的函数(甚至空的section也可以删除),而这些选项可以通过gcc前端传过去。
另外,全局没初始化的非static变量本身不会占据任意大的空间,只会占据一个descriptor,就是可执行文件里bss段多一个记录说明其大小,然后运行时由操作系统分配足够多的空间给该变量并且清零(说明白了,反正都是0,才不会花空间去储存)。全局static变量则因为外部不可见,所以不用的话会被编译器删除。
inline允许同一个函数在多个translation unit里被定义而不会发生链接错误,具体实现是因为inline把函数名标记为weak symbol,链接时weak symbol可以重名。对用户效果就是inline函数可以定义在h文件里。inline本身在函数调用处插入只是个建议,事实上四大主流编译器目前版本没有一个会遵守,你加不加inline,它们都会自己决定是否真的inline。
————————————————
版权声明:本文为优快云博主「Tinus Chen」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/qq_32693119/article/details/81667711
在一个源文件中,里面有很多函数,但是main函数没有全部调用,未使用的函数也会被编译,也会被“打包”到最后的可执行文件中,要去除掉不要的函数,方法如下:
1.执行gcc -function-sections <name.c>。其中-function-sections的意思是,将不同函数编译到不同的section上面。如果没有这个选项,所有的函数都会编译到一个section上面,于是函数就不能被“剥离”
2.执行ld --gc-sections <object>。表示把不要的函数section去掉。
————————————————
版权声明:本文为优快云博主「Tinus Chen」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/qq_32693119/article/details/81866471