Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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++_Templates_Inline Method - Fatal编程技术网

C++ C++;模板和内联

C++ C++;模板和内联,c++,templates,inline-method,C++,Templates,Inline Method,当我编写一个简单的(非模板)类时,如果函数实现是“就地”提供的,它会自动被视为内联 class A { void InlinedFunction() { int a = 0; } // ^^^^ the same as 'inline void InlinedFunction' } 在讨论基于模板的类时,这条规则如何 template <typename T> class B { void DontKnowFunction() { T a = 0; } //

当我编写一个简单的(非模板)类时,如果函数实现是“就地”提供的,它会自动被视为
内联

class A {
   void InlinedFunction() { int a = 0; }
   // ^^^^ the same as 'inline void InlinedFunction'
}
在讨论基于模板的类时,这条规则如何

template <typename T> class B {
   void DontKnowFunction() { T a = 0; }
   // Will this function be treated as inline when the compiler
   // instantiates the template?
};
在第一种和第二种情况下会发生什么


谢谢。

内联关键字不是“规则”。它仅仅是对编译器的一个建议/提示,它如何处理它完全取决于它和它的实现。考虑到这一点,不可能知道您的示例会发生什么。事实上,编译器可能会内联全部、部分或全部。据我所知,模板函数是自动内联的。然而,现实是大多数现代编译器经常忽略内联限定符。编译器的优化启发法很可能比人类程序员在选择内联哪些函数方面做得更好。

因为当你实例化一个类时,这个函数就像一个普通的成员函数。它是在那个类中定义的,所以函数是自动内联的


但这在这里并不重要。无论如何,您可以在一个程序中多次定义函数模板或类模板的成员-您不需要
inline
来告诉编译器这一点,就像在非模板的情况下一样

请问你为什么想知道这个问题的答案?我已经做了很多C++代码,而且我还没有遇到很多重要的情况。@贝诺胡在这里是一样的,但是最近当我写一些基于模板的代码时,我明白我实际上不知道在我所描述的情况下会发生什么。那为什么不问个问题呢?:)我不确定你想问什么,但我对答案感兴趣:o)我不相信DontKnowFunction()和内联函数有什么特别的地方。如果主体是类声明的一部分,则使用其被认为是隐式的或内联的,并且主体在声明之外。@Benoît,了解它可能非常有趣,特别是当您害怕对象代码膨胀时。我知道
inline
关键字作为建议,但在第一个示例中(当您在类定义内部编写代码时,
inline
是“自动加前缀的”,这意味着至少我向编译器提出了这个建议。但我不知道在基于模板的情况下会发生什么。我很确定有一些规则可以做到这一点……对,但无论内联是否显式或隐式存在,编译器都可以用它来做它将要做的事情,因此你不能预先确定编译器的行为。这就是's not actual correct@RC.-“在调用点执行[函数体]的此内联替换不需要实现;但是,即使省略此内联替换,也应遵守7.1.2中定义的内联函数的其他规则。”[工作草案7.1.2/2]当然-inline关键字执行2个函数:一个是向编译器提示,如果可能,函数应该在调用站点“内联”,这是编译器可以忽略的。“内联函数的其他规则”允许在使用它的每个翻译单元中定义内联函数。如果链接2个编译的翻译单元,则如果定义了某些非内联函数foo,将产生链接器错误“foo的多个定义”。@ZacharyKraus否。即使编译器不内联调用
inline
函数,也不能调用已声明但未定义的
inline
函数。“内联函数应在使用odr的每个翻译单元中定义,并且在每种情况下应具有完全相同的定义。”[N3337 7.1.2/4]编译器不允许忽略
inline
限定符,我也不知道任何现代编译器会忽略它。
inline
对函数的多个定义的语言规则进行特定的、定义良好的更改。这不仅仅是一个提示。inline是一个非常具体的定义含义。但它与“内联代码”和大多数现代编译器都会忽略它,因为它为“内联代码”提供了提示。它包含链接和其他不能忽略的内容。Charles,编译器可以忽略内联限定符。根据[C++模板完整指南]()必须将函数声明为inline@mazhaka当然:第72页第6.4节。“这可能会让人觉得函数模板在默认情况下是内联的。但是,它们不是。如果编写的函数模板应作为内联函数处理,则应使用内联说明符(除非函数已经内联,因为它是在类定义中定义的)“它是在该类中声明的,”应该改为Defined,否?@JohanLundberg是的,我相信这就是我想说的。我改了,谢谢。如果内联是函数模板的限定符,而不是类的成员,会发生什么?内联也是这样暗示的吗?
template <typename T> void B::DontKnowFunction() { T a = 0; }

template <typename T> inline void B::DontKnowFunction() { T a = 0; }