同一类型的多个声明是否会影响编译时间



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

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

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

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

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

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

这个答案讨论了为什么所提出的代码对编译时间几乎没有影响,而其他答案目前都没有解决这个问题。

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

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

分析语法结构的部分是这样做的:当它识别出void a()等声明中的a()时,它会在编译器的其他地方调用一个例程,该例程将a注册为类型为function returning void的标识符。当a()被识别时,当b()被识别时以及当c()被识别时发生这种情况。

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

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

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

不明显。别担心。

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

为什么要选择第一个选项?

自从声明以来,这两件事似乎都花了我同样的时间。编译器将每一个视为3个空,甚至空写三次。但将详细研究编译时。

但说真的,一个程序员会屈居第二,因为它符合导致代码美观的代码编写标准。

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

值得一问的问题。如果你有这个习惯,去看看编译器是如何将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)

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

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

简短问题的简单答案:否。

最新更新