【问题标题】:How the Inline functions having multiple lines of code are treated as a single line?如何将具有多行代码的内联函数视为一行?
【发布时间】:2018-01-20 13:27:03
【问题描述】:

我有一个关于全局定义内联函数(普通函数)的想法 如果 sn-p 很小,使用“内联关键字”会提高性能。我有 一个疑问: “如何在类中定义成员函数 也提供相同的性能并被视为内联?”

【问题讨论】:

  • “内联函数只包含一行代码”从哪里来?
  • “实际上内联函数包含一行代码” 没有强制要求。简单的 getter/setter 函数通常是这种情况,但绝对没有要求。
  • “实际上内联函数包含一行代码”——你从哪里读到的?
  • “实际上内联函数只包含一行代码...” - 不,这简直是错误
  • 术语“行”在 C++ 中几乎没有用处。您可以将具有多个语句的所有函数放在一行中,分号使其对编译器具有足够的可读性(尽管对人类来说不是)。

标签: c++ inline-functions


【解决方案1】:

实际上内联函数只包含一行代码

这个说法是错误的。没有这样的限制。

内联函数仅仅意味着所有的函数定义代码都直接放在声明的地方

但是在一个类中定义的成员函数包含多个代码而不是被视为内联,为什么?

如果您指的是 inline 关键字,则也没有限制使用该关键字标记的函数只能包含一行代码。

如果它实际上是由编译器内联的(即直接插入到位的汇编代码,没有函数调用)由其决定,并且主要取决于优化标志中选择的编译器优化策略。


如果非类成员函数完全定义在头文件中,则需要为它们提供 inline 关键字以避免 ODR 违规错误。

这是一个例子(假设是头文件):

class foo {
    int x_;

public:
     // Inside the class declaration 'inline' is assumed as default
     int x() const { return x_; }
     int y() const {
         int result = 0;
         // Do some complicated calculation spanning 
         // a load of code lines
         return result;
     }
};

inline int bar() { // inline is required here, otherwise the compiler
                   // will see multiple definitions of that function
                   // in every translation unit (.cpp) that includes
                   // that header file.
    return 42;
}

【讨论】:

  • inline 与函数内联无关。这只是“这件事允许有多个定义”的一种有趣的拼写方式。
  • @molbdnilo 我说的不是很清楚吗?我提到了 ODR 违规,否则将适用。
  • “如果它实际上被编译器内联”似乎暗示你认为它们是相关的,但我可能误解了你。
  • @molbdnilo 我试图表达相反的意思。是否放置inline 关键字不会对编译器如何发出相应的机器代码(函数调用或内联)产生任何影响。关于任何编程语言,我很少依赖“信念” 顺便说一句。作为一名大约 30 岁的专业软件开发人员,这总是一个坏主意 ;-) ...
【解决方案2】:

内联并不意味着它只是一行代码。这意味着在函数调用点插入单行或多行的整个代码,从而减少函数调用开销。

【讨论】:

  • 你的第二句话只说明了事实的一半。
  • inline 与函数内联无关。
【解决方案3】:

看看这段代码,我知道它不是 C++,但基本都是一样的。

#include <stdio.h>
#define inlineMacro(x) ((x) = (x) + 1); ((x) = (x) * 2)

int main()
{
    int i = 5;
    inlineMacro(i);
    printf("%i",i);

return 0;
}

输出:

12

您可以将所有代码放在一行中。所以不要被关键字内联贬低,它只是为了编译器。

【讨论】:

    【解决方案4】:

    我已经从你们那里得到了明确的解释。

    三四点的直觉:

    1.对于普通函数(不是在类中声明/定义的方法)inline关键字用于插入汇编代码(由编译器),从而避免重复函数调用。

    2.对于在类中声明的方法,如果将它们声明为带有inline关键字(无类概念)的普通函数,对于小sn-p,性能将是相同的。

    3.method 声明(对于类)是隐式内联的。

    4.functions 声明是(如果需要)显式内联。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-03
      • 1970-01-01
      • 2015-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-25
      • 2014-01-07
      相关资源
      最近更新 更多