1

对于作业,我们应该编写两种处理输出的方法。一种用于输出字符串,一种用于整数。

基本上我们有两个方法调用另一个方法:

void TheClass::displayString(string str){ cout << str; }
void TheClass::displayNumber(int n) { cout << n; }

inline 会通过不调用另一个函数来节省一些开销来加快速度,还是会在命名空间等方面为 cout 创建更多?

inline void TheClass::displayString(string str) { cout << str; }
inline void TheClass::displayNumber(int n) { cout << n; }
4

7 回答 7

13

命名空间与它没有任何关系。

您可能不会在这里看到任何好处,原因很简单:函数太小了,我希望编译器无论如何都会内联它。

请记住,关键字inline提示而不是指令,通常您可以让您的工具链决定何时内联。这很擅长。

于 2011-07-01T23:30:04.980 回答
2

我同意 Tomalak 的观点,内联只是一个提示,内联函数几乎没有任何好处。今天的处理器是如此之快,以至于再调用一个函数根本就无关紧要。

inline在opengl编程中使用了函数。OpenGL 程序是无限循环。为了使循环尽可能快地运行,您必须非常高效地编程,这样它才能保持对用户的响应并顺利生成图像。我相信声明一些函数inline会让程序运行得更快更流畅。

毕竟,不要指望这种技术会带来巨大的性能提升,在极端情况下可能只会减少 1-2% 的运行时间。

于 2011-07-01T23:53:01.987 回答
1

inline关键字与生成代码的内联关系不大。inline关键字表示函数被内联声明(即在其声明中定义),因此在多个编译单元中可能有重复的定义。当你想在头文件中定义一个函数时需要它,因为这个函数定义可以包含在多个编译单元中,如果没有inline关键字,这将违反单一定义规则。

如果您担心性能,请在代码运行时对其进行分析,而不是让不知道您的代码在做什么的人猜测您的瓶颈在哪里。

于 2011-07-02T04:22:17.317 回答
1

使用这两个函数,无论编译器是否内联函数,您可能都看不到任何值得注意的区别。

原因是流插入 ( <<) 相当慢。比一个简单的(非内联)函数调用慢得多。

而且,正如其他人已经指出的那样,您应该真正习惯于通过引用到常量(以及任何其他复制起来并不便宜的对象)来传递字符串。

在某些情况下,最好按值传递,即使(或尤其是)副本很昂贵(例如,当operator =使用复制和交换实现时)。但是这些很少见,只要你不能自己决定什么是合适的,你最好总是通过引用到常量而不是总是通过值。

于 2011-07-02T06:50:27.870 回答
0

如果您没有花费大量时间来产生输出,那么无论如何这都无关紧要。如果您已经对您的程序进行了概要分析,并确定您处于程序花费大部分时间生成输出的异常情况,那么您可以开始考虑如何使此代码更快。您可能不会通过添加 inline 关键字来使其更快,因为您的编译器可能已经内联了该函数,如果不是,即使您要求它也可能不会这样做(尽管它可能)。

真正使您的代码更快的一个简单的第一步是将您的字符串参数改为 const string&。这样你就不会复制字符串。更复杂的第二步是使用 C 输出 API 而不是 C++ 流。根据我的经验,C API 的速度要快得多,这在此处此处得到了支持。但是,除非您确定确实确实需要基于分析的性能,否则我不建议您迁移到 C API。

于 2011-07-02T04:11:06.123 回答
0

优化具有 const-reference 的一种方法:

void TheClass::displayString(cosnt string& str){ cout << str; }
于 2011-07-02T05:06:01.950 回答
0

Softnux,你为什么不简单地创建一个基准?创建一个for具有一百万次重复的循环,并查看每个选项需要多少时间。然后分别为 Debug 和 Release 构建执行基准测试。现代编译器应该弄清楚何时内联或循环展开是更好的选择。

编辑:尝试使用字符串流。输出到控制台将成为这里的瓶颈,而不是函数调用本身。

于 2011-07-02T10:49:48.147 回答