将内联加速 void a(string b) { cout << b; }
Will inline speed up void a(string b) { cout << b; }
对于一个赋值,我们应该编写两个处理输出的方法。一个用于输出字符串,一个用于整数。
基本上,我们有两个方法调用另一个方法:
void TheClass::displayString(string str){ cout << str; }
void TheClass::displayNumber(int n) { cout << n; }
内联是否会通过不调用另一个函数或它会为cout创建更多的名称空间吗?
inline void TheClass::displayString(string str) { cout << str; }
inline void TheClass::displayNumber(int n) { cout << n; }
命名空间与之无关。
您可能看不到任何好处,原因很简单:函数太小了,我希望编译器无论如何都能内联它。
请记住,关键字inline
是提示,而不是指令,通常您可以让工具链决定何时内联。它擅长这一点。
我同意Tomalak的观点,内联只是一个提示,内联函数几乎没有任何好处。如今的处理器速度如此之快,再调用一个函数根本不重要。
我在opengl编程中使用了inline
函数OpenGL程序是无限循环。为了使循环尽可能快地运行,你必须非常有效地进行编程,这样它才能对用户保持响应,并平滑地生成图像我相信声明一些函数inline
会使程序运行得更快、更流畅。
毕竟,不要指望这种技术会带来巨大的性能升级,在极端情况下可能只会减少1-2%的运行时间。
使用这两个函数,无论编译器是否内联函数,您都可能看不到任何显著的差异。
原因是,流插入(<<
(相当慢。比一个简单的(非内联的(函数调用慢得多。
而且,正如其他人已经指出的那样,您应该真正习惯于通过引用const(以及任何其他复制成本不高的对象(来传递字符串。
在某些情况下,最好通过值传递,即使(或特别是(复制成本很高(例如,在使用复制和交换实现operator =
时(。但这种情况很少见,只要你不能自己决定什么是合适的,你最好总是通过引用const,然后总是通过值。
inline
关键字与生成代码的内联作用非常小。inline
关键字表示函数是内联声明的(即在声明时定义的(,因此在多个编译单元中可能有重复的定义。当您想在标头中定义函数时,需要使用它,因为此函数定义可能包含在多个编译单元中,如果没有inline
关键字,这将违反"一个定义规则"。
如果你关心性能,那么在代码运行时对其进行评测,而不是让那些不知道你的代码在做什么的人猜测你的瓶颈在哪里。
如果您没有花费大量时间来生成输出,那么这无论如何都无关紧要。如果你已经分析了你的程序,并确定你的程序大部分时间都在生成输出,那么你可以开始考虑如何更快地生成代码。添加inline关键字可能不会让它更快,因为编译器可能已经在内联函数了,如果没有,即使你要求它也可能不会这么做(尽管可能(。
真正使代码更快的一个简单的第一步是使字符串参数为常量字符串&相反这样就不会复制字符串。更复杂的第二步是使用C输出API而不是C++流。根据我的经验,C API的速度要快得多,这在这里和这里都得到了支持。但是,我不建议改用C API,除非您确定您确实需要基于评测的性能。
优化以具有常量引用的一种方法:
void TheClass::displayString(cosnt string& str){ cout << str; }
Softnux,为什么不简单地创建一个基准呢?创建一个有一百万次重复的for
循环,看看每个选项需要多少时间。然后分别为Debug和Release构建执行基准测试。现代编译器应该弄清楚何时内联或循环展开是更好的选择。
编辑:尝试使用字符串流。输出到控制台将是这里的瓶颈,而不是函数调用本身。
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- std::cout.imbue()多重调用
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 在作为静态成员包含在另一个类中的类的构造函数中使用 cout
- 在 COUT 语句中使用 COUT 调用函数
- GCC 4.8.2 自动矢量化由于 cout 而失败
- std::cout输出int时出现编译错误
- 为什么COUT在朋友函数中不起作用,该功能超载了操作员&lt;&lt;这是一个iStream运算符
- C++标准::cout和<<操作员,优先级
- 以x的倍数填充前导零,使用std::cout<<std::十六进制
- 错误:没有匹配'运算符<<"在'std::cout
- 过载<<比如cout错误
- cout & lt; & lt;“text"只在部分时间显示
- 如何显示/打印字符串对象?cout & lt; & lt;Int工作,count <<字符串
- 我怎样才能到达cout<<"排序:";;当C++中没有输入数字时