gpt4 book ai didi

c++ - GNU C++ 编译器((GCC)5.2.0)本身是否擅长 "inlining"?

转载 作者:搜寻专家 更新时间:2023-10-31 00:32:04 25 4
gpt4 key购买 nike

我不是在问为什么或什么时候应该在某些代码中使用 inline

我在我认为常用的地方使用inline(比如在get/set 函数中)。我在堆栈上阅读了一些不寻常的示例,其中 inline 听起来是必要的。我不确定我是否会在我的代码中识别出这种情况......我的意思是,直到我遇到问题......

所以我想知道在通常情况下,编译器是否能像我一样处理这些问题,甚至更好......

我想避免 inline 的原因是为了避免在 header 中实现......关于这个问题,我脑海中浮现出一个问题:

编译器(在我的问题中我总是考虑 GCC 编译器)是否能够内联一个未在 header 中实现的函数?

注意: 我不知道 C++14 中是否有关于 inline 的一些内部变化。

最佳答案

首先内联一些东西,即要求在调用点内联替换函数体并不意味着实现被限制这样做:

7.1.2 Function specifiers

2 A function declaration (8.3.5, 9.3, 11.3) with an inline specifier declares an inline function. The inline specifier indicates to the implementation that inline substitution of the function body at the point of call is to be preferred to the usual function call mechanism. An implementation is not required to perform this inline substitution at the point of call; however, even if this inline substitution is omitted, the other rules for inline functions defined by 7.1.2 shall still be respected.

仅凭这一点就应该让人觉得依赖编译器优化(或者这样做很重要)关于这个主题是一种模糊的启发式方法。例如,我们知道编译器很难内联函数指针调用,但这并不重要。

有一些语言结构的例子是标准要求内联的,这不是一个好的编译器的问题,而是一个兼容的编译器的问题。

闭包类型的函数调用操作符

5.1.2

5 The closure type for a non-generic lambda-expression has a public inline function call operator (...) For a generic lambda, the closure type has a public inline function call operator member template (...)

constexpr 函数

7.1.5

2 (...) constexpr functions and constexpr constructors are implicitly inline (7.1.2).

删除的函数

8.4.3

A deleted function is implicitly inline. [ Note: The one-definition rule (3.2) applies to deleted definitions. — end note ] A deleted definition of a function shall be the first declaration of the function or, for an explicit specialization of a function template, the first declaration of that specialization.

其他示例是在类定义中定义的成员函数和在类的友元声明中定义的函数。内联并非在所有情况下都是最佳选择(会增加程序大小),因此对于性能关键部分,我建议进行基准测试并自行决定;毕竟Do inline functions improve performance?

关于c++ - GNU C++ 编译器((GCC)5.2.0)本身是否擅长 "inlining"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32299171/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com