我是c ++(以及编程本身)的新手,这就是我所听到的:
如果我们编译一个普通函数,编译器会创建一个指向该函数的指针,并将构成函数体的指令放在别处。这是普通函数的编译方式。但是在内联函数的情况下,编译器在编译期间生成代码并将其替换为内联函数调用。
我的问题是当编译成员函数(C ++类)时,它们被视为内联函数还是被视为普通函数?
答案 0 :(得分:5)
它们就像普通函数一样,但有一个例外:如果在类定义中编写函数定义(下面的示例),则会自动为函数提供inline
关键字:
[C++11: 9.3/2]:
成员函数可以在其类定义中定义(8.4),在这种情况下,它是内联成员函数(7.1.2) ,或者如果它已经被声明但未在其类定义中定义,则可以在其类定义之外定义。
struct T
{
void foo() // the same as `inline void foo()`
{
// ...
}
};
但这并不意味着该课程将被内联; inline
关键字只是一个提示,在决定是否实际内联函数时,现在很大程度上被忽略了,尽管它肯定会影响链接。
答案 1 :(得分:3)
你问:
它们被视为内联函数还是被视为普通函数?
类的成员函数可以是内联函数或非内联函数,具体取决于它们的声明和定义方式。
以下是标准中的相关信息:
9.3会员职能
2可以在类定义中定义成员函数(8.4),在这种情况下,它是内联成员函数(7.1.2),或者可以在其类定义之外定义它如果已经声明但未在其类定义中定义。出现在类定义之外的成员函数定义应出现在包含类定义...
的命名空间范围内
示例:
class A
{
A() : data(0) {} // Inline function
inline A(A const& copy) : data(copy.data) {}
// Inline function. The keyword inline
// can be used but not necessary.
int data;
};
3
inline
成员函数(无论是静态还是非静态)也可以在其类定义之外定义,前提是它在类定义中的声明或在类定义之外的定义将函数声明为{ {1}}。 [注意:命名空间范围内的类的成员函数具有外部链接。本地类的成员函数(9.8)没有链接。见3.5。 -end note ]
示例:
inline
4程序中最多只能有一个非内联成员函数的定义;无需诊断。程序中可能有多个内联成员函数定义。见3.2和7.1.2。
示例:
class A
{
A(); // Declaration doesn't say whether the function is inline or not.
inline A(A const& copy); // Declaration says the function is inline.
int data;
};
inline A::A() : data(0) {} // Implementation says the function is inline.
inline A(A const& copy) : data(copy.data) {}
答案 2 :(得分:2)
类方法的编译与独立函数的工作方式相同。如果你在它之前加上inline
关键字,编译器会尝试插入它的代码,如果可能的话,将它放在它的位置。
答案 3 :(得分:2)
是否内联函数完全取决于编译器的判断,这意味着不同的编译器可能具有不同的函数内联标准。话虽如此,您可以提示编译器使用inline
,__inline
和__forceinline
等关键字内联函数。但是,它并不保证您的函数将被内联。
但是,有些情况下通常无法内联。这个link from Microsoft可能会让你对函数内联有一个很好的了解。
无法内联的函数示例将是virtual
函数。由于virtual
函数调用(即要调用的virtual
函数定义)是在运行时确定的,因此编译器无法确定在每次调用{时调用哪个确切的函数定义{1}}功能。
virtual
感谢您的阅读。