C语言的程序文件中,完全没有调用过的函数会不会被编译?

自己写的而且没被调用的函数(注意不包括没有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。

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值