问题描述
我使用 g++
编译我的代码已有一段时间,然后转移到英特尔的 icpc
编译器。使用 icpc
我不断收到以下警告:
remark #11074: Inlining inhibited by limit max-size
remark #11074: Inlining inhibited by limit max-total-size
我在使用 g++
时从未遇到过这个问题。经过一番研究,我了解到我可以使用 -no-inline-max-total-size
和 -no-inline-total-size
进行编译以避免限制内联大小。我的问题是,尽可能多地删除内联和内联的尺寸是否总是一个好习惯?我的代码计算量很大,性能是关键,因此我的常识要求我应该为编译器允许尽可能多的内联。真的吗?是否存在强制内联限制有用的情况?
解决方法
我的问题是,尽可能多地去除内联和内联的尺寸是否始终是一个好习惯?
不,消除内联的大小限制或尽可能多地内联并不总是一种好的做法。
理想情况下,内联应该仅在提高性能时进行。
在某些情况下,施加内联限制是有用的吗?
如果一个函数非常大,并且从许多上下文中调用它,那么将此类函数内联到所有这些上下文会使可执行文件膨胀。如果可执行文件本身因为内联而有几GB,那么从磁盘加载程序可能会成为瓶颈。
在不太病理的情况下,权衡更微妙。找出最佳极限的方法是测量。配置文件引导优化可以为优化器提供比简单的硬限制更有用的启发式方法。