【问题标题】:Do comments get translated to machine code? C++注释会被翻译成机器代码吗? C++
【发布时间】:2015-05-11 02:57:50
【问题描述】:

当一个用 C++ 编写的程序有 cmets 时,这些 cmets 是否被翻译成机器语言,或者他们永远不会做到这一点?如果我编写的 C++ 程序在两个命令之间包含整本书的 cmets,我的程序会花费更长的时间来编译或运行更慢吗?

【问题讨论】:

  • 标准 C++ 中没有任何内容要求将 cmets 转换为机器代码或以任何方式存储在二进制文件中,而是简单地忽略它们。
  • 您是否希望您的 cmets 以任何方式影响您的程序的执行?
  • 但是汇编代码可能包含大量的 cmets。它们可能是相互列出的源代码(其中可能包含接近源代码行的 cmets)、编译器生成的信息,如指令时序、寄存器使用、代码大小……所以,有点,是的,就好像你说汇编是机器语言。
  • 可执行文件中不存在汇编语言的注释。
  • Visual C+ 有#pragma comment,这表明 Visual C++ 应该在生成的目标文件中留下注释。因此,如果您真的想在其中发表评论...

标签: c++ performance compilation comments compiler-optimization


【解决方案1】:

注释通常在预处理过程中被删除,因此编译器本身根本看不到它们。

他们可以(并且通常会)稍微减慢编译速度——预处理器必须通读整个注释才能找到它的结尾(因此后续代码将被传递给编译器。除非你包含真正庞大的 cmets(例如, 兆字节) 但差异可能不会很明显。

虽然我从未见过(或听说过)C 或 C++ 编译器可以做到这一点,但有一些编译器(例如,用于 Pascal 的编译器)使用特殊格式的 cmets 将指令传递给编译器。例如,Turbo Pascal 允许(并且它的继任者可能仍然允许)用户在注释中使用编译器指令打开和关闭范围检查。在这种情况下,注释并没有(至少在我知道的情况下)本身生成任何机器代码,但它可能并且确实影响了为注释之外的代码生成的机器代码。

【讨论】:

    【解决方案2】:

    不,它们被 preprocessor 删除。您可以使用 cpp: The C Preprocessor 进行检查。只需编写一个带有注释的简单 C 程序,然后使用 cpp comment.c | grep "your comment"

    【讨论】:

      【解决方案3】:

      第三翻译阶段

      • 源文件被分解为 cmets、空白字符序列(空格、水平制表符、换行符、垂直制表符和换页符) ,以及预处理令牌。

      • 每条评论都替换为一个空格字符。

      有关翻译阶段的更多信息,请参阅此cpprefference article

      【讨论】:

        【解决方案4】:

        预处理器消除了 cmets.. 为什么编译器仍然要读取它们?它们的存在是为了让人们更容易理解代码。 你没听过“评论很难,你总是被忽视”这样的笑话吗:p

        【讨论】:

          【解决方案5】:

          不,它们只是被编译器忽略。评论的唯一目的是供人类阅读,而不是机器。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-06-26
            • 2011-09-05
            • 1970-01-01
            • 1970-01-01
            • 2016-08-04
            • 2014-01-06
            相关资源
            最近更新 更多