1

我有一种如下所示的方法。for 循环是否总是让编译器执行“内联请求”?

inline void getImsiGsmMapFrmImsi
  (
    const string& imsiForUEDir, 
    struct ImsiGsmMap& imsiGsmMap
  )
{
    for (int i = 0 ; (unsigned)i < imsiForUEDir.length() - 1 ; i++)
    {
         imsiGsmMap.value[i] = imsiForUEDir[i] - '0' ;
    }
    imsiGsmMap.length = imsiForUEDir.length() - 1 ;
}
4

6 回答 6

5

您可以指定“内联”,如果感觉如此,编译器可以忽略它。

于 2009-10-23T06:00:45.363 回答
3

简单地说,没有。

" inline" 只是对编译器的提示。

有一些方法可以强制编译器执行inline某些操作,但这些方法是特定于编译器的。你的代码在我看来是移动的,所以这里有一些在各种手机平台上使用的 C++ 编译器的方法:

Windows CE/Windows Mobile VC++ ARM 编译器使用__forceinline关键字而不是提示“ inline ”。

用于 Windows CE/Windows Mobile 的更好的编译器(即更快的输出)是cegcc,它使用最新的 GCC 4.4。在 GCC 中,你写__attribute__((always_inline)) 函数名之后和主体之前。

更重要的是内联这个循环是否是个好主意。我以编写手机为生,他们一般没有太多的CPU预算。但如果这个循环是一个瓶颈,我会感到非常惊讶。去掉你的程序中所有的“内联”装饰,当你快要发货时,如果程序很慢,请分析它!

一些编译器允许“配置文件引导优化”,他们可以制作一个以实际方式运行的检测二进制文件,然后他们使用收集到的数据制作一个生产二进制文件,在那里他们就代码速度和代码大小做出明智的决定您的程序的一部分,以提供两者的最佳组合。

于 2009-10-23T05:55:13.003 回答
2

“没有循环函数的内联”可能是来自某些特定编译器的一些内联启发式。它并不普遍适用。

每个编译器都使用一些启发式方法来确定函数是否应该内联,但通常每个编译器都使用自己的。所以,说循环会对内联产生一些普遍的影响是不正确的。它不会。您的函数中绝对没有任何东西可以从根本上排除内联。大多数现代编译器可以轻松地内联这个函数,如果他们认为这是合理的,或者如果你强迫他们这样做。

是的,一些编译器提供了非标准的声明说明符(或编译器选项),它们实际上会强制内联,即覆盖启发式分析,除非内联确实超出了编译器的能力。例如,许多现代 C/C++ 编译器通常不能内联具有可变数量参数的函数(可变参数函数)。

人们还普遍认为递归函数不能内联。实际上,在许多编译器中,递归函数可以内联到某个固定的递归深度,从而“压缩”递归。

于 2009-10-23T06:07:48.453 回答
0

我想知道 inline 关键字是否还有必要。无论如何,现代编译器不大多只是忽略它并做他们认为最好的任何事情吗?

于 2009-10-23T06:02:02.567 回答
0

最有可能的编译器不会用循环内联函数,因为这有什么意义呢?如果代码是循环的,与循环相比,函数调用的成本通常是无法衡量的噪音。

但是如果编译器想要内联它(也许编译器足够复杂,可以确定循环边界,甚至可以展开循环),它当然是允许的。

但我不会打赌。

于 2009-10-23T06:14:41.513 回答
0

总结一下我之前给出的答案,在选择内联函数时应该注意的事项是:

* local static variables
* loop constructs
* switch statements
* try/catch
* goto
* recursion
* and of course too much complexity (whatever that means)

话虽如此,正如此处的其他答案所指出的那样,编译器是否内联函数基本上是未指定的。7.1.2/2 有:

带有 inline 说明符的函数声明(8.3.5、9.3、11.4)声明了一个内联函数。inline 说明符向实现表明,在调用点对函数体进行内联替换优于通常的函数调用机制。在调用点执行此内联替换不需要实现;然而,即使省略了这个内联替换,7.1.2 中定义的内联函数的其他规则仍应得到遵守。

一个有趣的细节是,编译器通常会标记这里涉及的行为类型。例如:“它未指定”或“行为未定义”等。

于 2009-10-23T09:46:47.843 回答