【发布时间】:2016-06-14 10:18:26
【问题描述】:
我一直认为内联函数应该是短函数,否则可执行文件会因过多的相同代码副本而变得臃肿。
但是,我尝试重构我的代码并编写小的帮助函数,这些函数通常不是那么小(20-30 行),并且通常只被一个其他函数使用,例如避免使用do{...}while(false); 成语。
因此我的问题是:
- 内联一个长函数不是一个好主意吗?可执行文件的大小相同,并且会保存一个函数调用。
- 一个好的编译器会考虑这个吗?或者长度是不内联函数的一个强有力的标准。这是否取决于我是否明确写了
inline,因为编译器似乎大多忽略了这一点?
【问题讨论】:
-
现代编译器会忽略代码中的
inline关键字。当他们认为有必要时,他们自己内联方法。 -
do{}while(false)技巧是用来在宏中进行直观扩展的,为什么要在函数中使用呢? -
为什么要内联函数?速度,通常。但是,如果函数对于大的某些定义来说是“大”的,那么它并不完全适合指令流水线,你可能最终会出现缓存未命中......内联一个长函数会给你带来什么好处?
-
@Quentin 我猜 OP 想通过将函数转换为宏来让他的编译器别无选择。现在预处理器必须内联,以牺牲基于宏的解决方案为代价,这在所有方面都比内联差。
-
何时进行内联由编译器自行决定(无论是否使用
inline关键字)。它可能会忽略或假设inline,具体取决于其编译模型的实现方式。是的,当使用较少的次数时,一个好的编译器可以轻松地内联单个大函数(再次特定于编译器实现,如果 less = 1 或更多)。在链接的欺骗中,引用了另一篇文章,其中进一步讨论了这个概念。这是来自它的one good answer。一般来说,长度可能不是现代编译器内联的唯一标准。