如果你只是学习语言,你真的不应该担心这一点。考虑到速度,直到证明相反。也就是说,这里有很多误导性或不完整的答案,因此为了记录,我将充实一些微妙的含义。考虑你的类:
class Booth
{
public:
int get_tickets_sold();
void set_tickets_sold();
private:
int tickets_sold;
};
实现(被称为定义)的获取和设置功能尚未指定的。如果你在类声明中指定了函数体,那么编译器会认为你隐式地要求它们被内联(但如果它们过大,可能会忽略)。如果您稍后使用关键字inline
来指定它们,那确实具有安全效果。综上所述...
class Booth
{
public:
int get_tickets_sold() { return tickets_sold; }
...
......还有......
class Booth
{
public:
int get_tickets_sold();
...
};
inline int Booth::get_tickets_sold() { return tickets_sold; }
...是等价的(至少在什么样的标准鼓励我们期待方面,但个别编译启发式可能会有所不同 - 内联是编译器可以忽略的请求)。
如果稍后没有使用关键字inline
指定函数体,那么编译器没有义务将它们内联,但仍可能选择这样做。如果它们出现在相同的翻译单元中(即,在编译的.cc/.cpp/.C++/etc。“实现”文件或者它直接或间接包含的某个头文件中),则更有可能这样做。 如果执行只适用于链接时,则功能可能无法在所有内联,但它取决于特定的编译器和链接器进行交互和协作的方式。它是而不是只是一个优化和期待魔术的问题。为了证明这一点,考虑下面的代码:
// inline.h:
void f();
// inline.cc:
#include <cstdio>
void f() { printf("f()\n"); }
// inline_app.cc:
#include "inline.h"
int main() { f(); }
建立这样的:
g++ -O4 -c inline.cc
g++ -O4 -o inline_app inline_app.cc inline.o
侦办内联:
$ gdb inline_app
...
(gdb) break main
Breakpoint 1 at 0x80483f3
(gdb) break f
Breakpoint 2 at 0x8048416
(gdb) run
Starting program: /home/delroton/dev/inline_app
Breakpoint 1, 0x080483f3 in main()
(gdb) next
Single stepping until exit from function main,
which has no line number information.
Breakpoint 2, 0x08048416 in f()
(gdb) step
Single stepping until exit from function _Z1fv,
which has no line number information.
f()
0x080483fb in main()
(gdb)
通知执行从0x080483f3就在main()到0x08048416在f()然后返回到main()中的0x080483fb ...清除而不是内联。这表明内联不能仅仅因为函数的实现是微不足道的。
注意,这个例子是目标文件的静态链接。很显然,如果你使用的库文件,你可以真的想避免内联的功能明确,这样就可以无需重新编译客户端代码更新库。无论如何,在加载时隐式地完成链接的共享库更加有用。
很多时候,如果这些函数可以在任何性能关键的循环中被调用,那么提供微不足道的函数的类会使用两种形式的预期内联函数定义(即在类中或关键字inline
)是通过内联函数,你强制客户端代码重新编译(相对缓慢,可能没有自动触发)和重新链接(快速,共享库发生在一次执行),而不仅仅是重新链接,以捡更改功能实现。
这些考虑很烦人,但是这些权衡的谨慎管理是允许企业使用C和C++来扩展到数十亿和数亿行以及数千个单个项目,并且几十年来共享各种图书馆。另一个小细节:作为一个球形图,一个非线性get/set函数通常比等效内联代码慢大约一个数量级(10倍)。这显然与CPU,编译器优化级别,变量类型,缓存命中/缺失等变化..
为什么你要担心的表现? – GManNickG 2011-02-24 04:59:17
因为我必须做我的分配和运行速度最快可能会获得积分上你的老师 – 2011-02-24 06:14:53
耻辱让你们认为性能问题,而不是好的设计的代码。 – GManNickG 2011-02-24 06:48:20