注释会被翻译成机器代码吗? C++
Posted
技术标签:
【中文标题】注释会被翻译成机器代码吗? C++【英文标题】:Do comments get translated to machine code? C++ 【发布时间】:2015-05-11 02:57:50 【问题描述】:当一个用 C++ 编写的程序有 cmets 时,这些 cmets 是否被翻译成机器语言,或者他们永远不会做到这一点?如果我编写的 C++ 程序在两个命令之间包含整本书的 cmets,我的程序会花费更长的时间来编译或运行更慢吗?
【问题讨论】:
标准 C++ 中没有任何内容要求将 cmets 转换为机器代码或以任何方式存储在二进制文件中,而是简单地忽略它们。 您是否希望您的 cmets 以任何方式影响您的程序的执行? 但是汇编代码可能包含大量的 cmets。它们可能是相互列出的源代码(其中可能包含接近源代码行的 cmets)、编译器生成的信息,如指令时序、寄存器使用、代码大小……所以,有点,是的,就好像你说汇编是机器语言。 可执行文件中不存在汇编语言的注释。 Visual C+ 有#pragma comment
,这表明 Visual C++ 应该在生成的目标文件中留下注释。因此,如果您真的想在其中发表评论...
【参考方案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】:不,它们只是被编译器忽略。评论的唯一目的是供人类阅读,而不是机器。
【讨论】:
以上是关于注释会被翻译成机器代码吗? C++的主要内容,如果未能解决你的问题,请参考以下文章