Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 内联C++;代码_C++_Inline Functions - Fatal编程技术网

C++ 内联C++;代码

C++ 内联C++;代码,c++,inline-functions,C++,Inline Functions,以下代码是否有任何差异: class Foo { inline int SomeFunc() { return 42; } int AnotherFunc() { return 42; } }; 这两个函数都是内联的吗?内联真的有什么不同吗?关于何时应该或不应该内联代码,有什么规则吗?我经常使用AnotherFunc语法(例如访问器),但我很少直接指定inline。两种形式的内联方式应该完全相同。内联对于类定义中定义的函数体是隐式的。内联关键字本质上是对编译器的提示。使用inlin

以下代码是否有任何差异:

class Foo  
{
  inline int SomeFunc() { return 42; }
  int AnotherFunc() { return 42; }
};

这两个函数都是内联的吗?内联真的有什么不同吗?关于何时应该或不应该内联代码,有什么规则吗?我经常使用
AnotherFunc
语法(例如访问器),但我很少直接指定
inline

两种形式的内联方式应该完全相同。内联对于类定义中定义的函数体是隐式的。

内联关键字本质上是对编译器的提示。使用
inline
不能保证函数是内联的,省略它也不能保证函数不会内联。您只是让编译器知道,更努力地内联该特定函数可能是个好主意。

Sutter的本周大师33回答了您的一些问题和更多问题


如果您认为自己比编译器更了解VC++支持和指令。提示:你可能不会

Inline是一个编译器提示,不强制编译器内联代码(至少在C++中)。因此,简短的回答是它的编译器,并且可能与您的示例中发生的情况有关。大多数好的编译器可能都会内联这两个函数,特别是由于这两个函数的常量返回都有明显的优化

一般来说,内联不是您应该担心的事情。它带来了不必执行机器指令来生成堆栈帧和返回控制流的性能优势。但在所有情况下,除了最特殊的情况,我认为这是微不足道的

内联在两种情况下很重要。如果您处于实时环境中,且响应速度不够快,则可能会出现这种情况。第二个问题是,如果代码分析在一个非常紧密的循环中显示了一个明显的瓶颈(即反复调用一个子例程),那么内联可能会有所帮助

特定的应用程序和体系结构也可能使您将内联作为一种优化

class Foo  
{
  inline int SomeFunc() { return 42; }
  int AnotherFunc() { return 42; }
};
两种方法都保证编译相同的代码,这是正确的。然而,这两种方法都不可取。根据您的定义,您通常应该在类定义内声明它,然后在类定义外,在标题内,使用显式内联关键字定义它。正如常见问题解答所描述的,这是因为您希望将声明和定义分开,以确保其他声明的可读性(声明相当于“what”和定义“how”)

内联真的有什么不同吗

是的,如果编译器允许内联请求,那么情况就大不相同了。将内联代码视为宏。无论在何处调用,函数调用都将替换为函数定义中的实际代码。如果内联较大的函数,这可能会导致代码膨胀,但如果函数太大,编译器通常会通过不授予内联请求来防止代码膨胀

关于何时应该或不应该内联代码,有什么规则吗


我不知道有什么硬性+快速的规则,但有一个指导原则是,如果内联代码经常被调用并且相对较小,则只使用内联代码。setter和getter通常是内联的。如果它位于代码中性能特别密集的区域,则应该考虑内联。请记住,你正在用内联来执行可执行大小的执行速度。

< P>我发现如果C++中的内联被省略,则会有一些C++编译器(即SunStudio)抱怨。
int AnotherFunc() { return 42; }
因此,我建议在这种情况下始终使用inline关键字。不要忘记删除内联关键字,如果你以后将该方法实现为实际函数调用,这将真正搞乱链接(在SunStudio 11和12和Borland C++ + Builder)中。
我建议尽量少使用内联代码,因为当使用调试器单步执行代码时,即使使用“step over”命令,它也会“单步执行”内联代码,这可能非常烦人。

注意,在类之外,
inline
在代码中做了一些更有用的事情:通过强制(嗯,有点)C++编译器在每次调用函数时生成内联代码,它防止不同翻译单元中相同符号(函数签名)的多个定义。p> 因此,如果您在头文件中内联一个非成员函数,并将其包含在多个cpp文件中,则不会让链接器对您大喊大叫。如果函数太大,您无法建议内联调用,请使用C方式:在头中声明,在cpp中定义

这与代码是否真正是内联的关系不大:它允许在头中实现样式,这对于短成员函数很常见


(我认为,如果编译器需要函数的非内联呈现,就像模板函数一样,那么它将是智能的,但是…

在执行优化时,也要补充Greg所说的内容(即内联的-ing)编译器不仅参考代码中的关键字,还参考其他命令行参数,指定编译器应如何优化代码。

内联的源代码对函数体是隐式的?我确信这不是C++标准的一部分。你指的是另一个环境吗?C++注释,第6.3.1节。在C++的03标准中,实际引用是93/2:“成员函数可以在类定义中定义(8.4),在这种情况下,它是内联成员函数(7.1.2),……”