多个相同类型的声明会影响编译时间吗?

时间:2013-06-25 11:38:39

标签: c++ c

我想知道声明同一类型的多个事物是否会影响编译时间,例如下面的内容。

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

VS

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

9 个答案:

答案 0 :(得分:7)

如果它与无关紧要我会感到惊讶,因为编译器将为这两种情况执行不同的代码,但是不可能猜出哪一种会更快,以及是否会更快一直比另一个快。

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

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

答案 1 :(得分:6)

不明显。别担心。

答案 2 :(得分:6)

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

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

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

分析语法结构的部分是这样的:当它在a()之类的声明中识别void a()时,它会调用编译器中其他位置注册a的例程类型为function returning void的标识符。如果识别出a(),识别出b(),并且识别出c(),则会发生这种情况。

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

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

如果处理中的细微差别可能会影响处理器缓存中存储的内容或分配和释放的内存,则可能会产生级联效应。然而,这些都是偶然的,就像机械师在一辆车上工作并且碰巧将扳手移到不同的架子上一样,它会影响他们在下一辆车上工作需要多长时间,因为他们有走到架子上拿扳手。这只是偶然而非有意义的因果关系。

答案 3 :(得分:4)

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

答案 4 :(得分:2)

为什么选择第一个选项?

自从声明以来,两者似乎都花了相同的时间。编译器将每个作为3 void,即使void也只写三次。但是会详细研究编译时间。

但严重的是,程序员将会排在第二位,因为它可以达到代码编写标准的标志,从而实现代码之美。

答案 5 :(得分:0)

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

答案 6 :(得分: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)

无论您使用什么语法来表达它,只有一种方法可以在程序集级别保留变量空间。所有编译器只在一条指令中保留局部变量空间。

答案 7 :(得分:0)

两者都是相同的,但使用第二个代码总是好的,这样代码将更加结构化,可读并且易于被除您之外的其他人理解。第一个会增加更多混乱。

答案 8 :(得分:0)

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