7

我想知道声明多个相同类型的东西是否会影响编译时间,如下所示。

void a(),
     b(),
     c();

对比

void a();
void b();
void c();
4

9 回答 9

7

如果它根本不重要,我会感到惊讶,因为编译器将为这两种情况执行不同的代码,但无法猜测哪一种会更快,以及一种是否会始终比另一种更快。

如果能够以任何有意义的方式测量差异,我也会感到惊讶,因为它很可能永远不会是超过几微秒的问题。

如果您遇到编译时间问题,则声明样式不是原因。

于 2013-06-25T12:00:41.643 回答
6

不明显。别担心。

于 2013-06-25T11:39:09.590 回答
6

该答案讨论了为什么建议的代码对编译时间几乎没有影响,而其他答案目前都没有解决。

通常,现代编译器的一些基本结构是:

  • 有一个部分读取每个字符,将字符匹配到简单的模式(例如“以字母开头的字母和数字序列”或“+”或“/*文本*/”,并将它们打包成带有额外的标记数据(带有文本的标识符,类型为 + 的运算符,空格)。这部分称为词法分析器。
  • 有一部分接收标记并分析它们的句法结构。
  • 这里还有其他部分与我们无关。

分析句法结构的部分会做这样的事情:当它a()在诸如 之类的声明中识别时void a(),它会调用编译器中其他地方的例程,该例程注册a为类型为 的标识符function returning void。这发生在何时a()被识别、何时b()被识别以及何时c()被识别。

在这种情况下,重要的是,两个提议的代码序列发生了相同的事情:a()b()c()被识别,并且进行相同的例程调用序列来注册这些标识符。从那时起,它们的处理是相同的。a()在典型的编译器中,处理,b()和的方式没有区别c()

这意味着编译器处理这些代码序列的唯一区别在于词法分析器和语法处理器。对于其中一个代码序列,有更多的字符和更多的标记,因此该代码序列可能需要稍长的处理时间。然而,以当今计算机的速度,这个时间量是微不足道的。

如果处理中的细微差异碰巧影响到处理器缓存中存储的内容或分配和释放的内存,则处理中的细微差异可能会产生级联效应。然而,这些完全是偶然的,就像机械师在一辆车上工作时碰巧把扳手移到了不同​​的架子上,这可能会影响他们在下一辆车上工作的时间,因为他们有走到架子上拿扳手。这只是偶然事件,而不是有意义的因果关系。

于 2013-06-25T13:49:12.093 回答
4

编译时间没有太大区别。但最好使用第二个,因为它更标准、可读和易懂。将尝试参考有关编译时间来编辑此答案。

于 2013-06-25T11:52:29.497 回答
2

为什么要选择第一种选择?

自从宣布以来,两者似乎都需要我同样的时间。编译器会将每个视为 3 void,即使 void 被写入三次。但会详细研究编译时间。

但说真的,程序员将获得第二名,因为它符合代码编写标准的标准,从而导致代码的美感。

于 2013-06-25T17:02:04.233 回答
0

当然是一样的。没有人会写第一版

于 2013-06-25T11:54:33.190 回答
0

值得一问的问题。如果您保持习惯去看看您的编译器实际上是如何将您的 C++ 代码转换为汇编的,那么这更容易回答:这两个定义将输出完全相同的汇编代码。例如,我编译了一个小测试(使用输入和输出来避免常量折叠优化),两个版本输出完全相同的二进制文件(按字节相同)。

#include <iostream>
int main(int argc, const char * argv[])
{
    int a, b;
    std::cin >> a >> b;
    std::cout << a << b;
}

#include <iostream>
int main(int argc, const char * argv[])
{
    int a;
    int b;
    std::cin >> a >> b;
    std::cout << a << b;
}

如果你去看反汇编,你会看到 int 声明被编译成类似的东西:

0x100000ef6:  movq   %rsi, -16(%rbp)

无论您使用什么语法来告诉它,只有一种方法可以在汇编级别保留变量空间。所有编译器将仅在一条指令中保留局部变量空间。

于 2013-06-25T12:38:46.757 回答
0

两者都是相同的,但使用第二个总是好的,这样代码会更有条理,更易读,并且更容易被你以外的其他人理解。第一个会增加更多的混乱。

于 2013-06-25T12:42:53.900 回答
0

对一个简短问题的简单回答:不。

于 2013-06-25T12:46:01.147 回答