*。cpp文件中实现的c ++函数/方法从不进行内联扩展吗?

问题描述 投票:0回答:1

[已经有很多关于c ++中“内联”的很好的解释,例如thisthis ...

但是,大多数情况下,他们谈论的是“即使具有内联前缀的func可能会扩展也可能不会扩展”,或关于“取决于编译器...”。

最近我重构旧代码时,我需要确定是否将某些内联函数/方法保留或移动到确定的文件(而不是头文件)中。因此,我需要知道“如果在* .cpp文件而不是头文件中实现func / method(不带内联前缀),可以NEVER内联/扩展吗?”。如果我们让它们停留在标题中,至少有机会/希望它们会被内联?

请原谅我难看的英语,这不是我的主要语言。

c++ linker inline header-files compiler-optimization
1个回答
0
投票

*。cpp文件中实现的c ++函数/方法从不进行内联扩展吗?

这是一个实现问题,特定于您的特定C ++编译器。

[如果您使用最新的GCC作为C ++编译器,您可能会对compiler flags(例如-Wall -O0 -fno-inline)感兴趣(或者相反,在编译时和optimizing时都带有-flto -fwhole-program -Wall -O3link )。明智地配置build automation工具(例如Makefile)。

但是生成的可执行文件运行速度可能较慢。

我将在2020年5月(例如RefPerSys中使用)与g++ -fno-inline -O0 -g3或GCC 10一起使用GCC 9,以便于通过GDB进行调试(在Linux / Debian / Sid / x86-64上)。相同的C ++源代码可以在两个不同的ELF可执行文件中进行两次编译,一个具有完整的DWARF信息且没有内联,而另一个具有DWARF信息和优化标志。

最近在重构旧代码时,我需要确定是否将某些内联函数/方法保留或移动到确定的文件(而不是头文件)中。

这样做的唯一合理原因是减少编译时间。这是一个真正的问题吗?编译C ++代码需要几个小时?您可能还会要求经理或客户购买功能更强大的开发计算机。向Workplace寻求指导并提供法律详细信息。

[可能是在调试阶段用g++ -Wall -Wextra -O0 -fno-inline -g进行编译,并提供出于生产目的而编译并链接到g++ -Wall -Wextra -O3 -flto的相同C ++代码。如果需要考虑可执行文件的大小,请考虑将-O3替换为-Os。 YMMV。

还请考虑法律因素,请参阅this。>>

当然,请阅读有关C ++的更多信息。我想到了n3337 C ++ 11标准。

关于内联,如果发生内联,则可以使用g++ -S -fverbose-asm -O3进行编译并查看生成的代码。您甚至可以编写自己的GCC plugin来驱动内联决策(请参阅GCC MILEPOST项目)。这将需要几个月的全职工作。

© www.soinside.com 2019 - 2024. All rights reserved.