C++ - 避免类定义中定义的函数的隐式内联

标签 c++

在我的实现文件(.cc 文件)中,我经常发现在类定义中定义成员函数(例如 Pimpl 类的函数)很方便。例如:

struct X::Impl {
    void DoSomething() {
        ...
    }
};

而不是

struct X::Impl {
    void DoSomething();
};

void X::Impl::DoSomething() {
    ...
}

出于多种原因,我认为这比在类定义之外实现函数更可取。它增强了可读性并促进了保持方法较小的实践(通过使添加方法变得容易)。由于您无需更新方法声明,因此代码也更易于维护。

我看到的唯一缺点是类声明中定义的方法是隐式内联的,这通常是不可取的,因为目标代码的大小会增加。

我的问题是:

  1. 我有这个权利吗?我忽略了这种做法还有其他缺点吗?

  2. 隐式内联需要担心吗?编译器是否足够聪明,可以拒绝我对不应内联的内联方法的隐式请求?

  3. 是否可以(通过编译器扩展或其他方式)声明类定义中定义的方法不被内联?

最佳答案

简单的答案是您不应该关心。类定义中定义的成员函数是隐式内联的,但这并不意味着它们内联(即代码不需要在调用位置内联)。

编译器实现者投入了大量的时间和资源来提出启发法,根据函数的大小、复杂性以及是否可以内联来确定是否应该进行实际内联(递归函数不能内联[*])。编译器比我们大多数人拥有更多关于生成的代码及其运行架构的信息。相信它,然后,如果您觉得可能存在问题,请进行分析,并且如果分析表明您应该更改代码,那就这样做,但在事后做出明智的决定。

如果您想验证该函数是否实际上已内联,您可以查看程序集并检查是否有对该函数的调用或代码是否确实内联。


[*] 如果编译器可以将递归转换为迭代,就像尾递归的情况一样,那么理论上转换后的函数可以被内联。但是,无论如何,带有循环的函数被内联的可能性较小......

关于C++ - 避免类定义中定义的函数的隐式内联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10858458/

相关文章:

c++ - 在 C++ 中获取 int 的十进制表示长度的最佳方法是什么?

c++ - 错误LNK2019是什么意思

c++ - 在 C++ 中组合不同的文本文件

c# - C++中的字符串?

c++ - g++ 链接器错误 : undefined reference

c++ - 如何测试文件存储的浮点表示?

c++ - 在类范围内将指针传递给 constexpr 函数时是否滥用推断父模板的参数

c++ - 为什么 memory_order_relaxed 和 memory_order_seq_cst 没有区别?

c++ - C++ 中的字符计数

c++ - 如何解析多行的字符串对?