c++ - 关于内联性能的问题

标签 c++ c optimization inline

我有一些关于在 C 和 C++ 中对函数使用内联的问题。有人告诉我在我经常使用的小功能上使用它,但我想确切地了解它是如何工作的。这里只是一个示例的片段。

static inline point3D createPoint3D(float x, float y, float z){
   point3D newPosition;
   newPosition.x = x;
   newPosition.y = y;
   newPosition.z = z;
   return newPosition;
}
  1. 它到底做了什么,为什么它可以帮助代码运行得更快?这是 90 年代的过时优化吗?

  2. 为什么我只能在小函数上使用它?如果我为大功能做它会很糟糕吗?

  3. 在大量函数上使用它不好吗?

最佳答案

  1. 它更像是 70 年代或(至多)80 年代的过时优化。几乎任何有能力的编译器都可以选择函数进行内联扩展,而无需您的任何帮助,除了启用优化开始。

  2. 它应该做的是消除调用函数的开销。这对于几乎什么都不做的微小函数之类的事情非常重要。碰巧的是,这些非常普遍,以至于从 C++ 中获得即使是半途而废的性能几乎都需要编译器或多或少地自动扩展内联函数。

  3. 使用它通常毫无意义。

  4. 通常不会——如上所述,当内联函数有好处时,编译器通常可以自动这样做。

需要注意两点:1) 大多数编译器可以/将生成不带 inline 关键字的内联函数,以及 2) 大多数编译器可以/将忽略 inline 关键字,如果他们认为该函数不适合内联扩展(不过,仅 FWIW,如果您真的确定自己​​比编译器更了解,Microsoft 有一个 __forceinline 来克服后者)。

关于c++ - 关于内联性能的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3696801/

相关文章:

c++ - constexpr 比 const 多 "constant"吗?

c - hashlife alg 如何在 Golly 永远持续下去?

计算一个句子的字母给出随机输出

c++ - 饱和减法/加法无符号字节

使用 GCC -O2 选项编译生成不同的程序

MySQL 索引扫描排序不起作用

c++ - type_info 成员函数如何工作?

c++ - 如何正确地将变量传递给线程中的lambda函数

c - 更改数据类型后程序不显示第一个操作数

c++ - 将 std::vector 转换为数组