【发布时间】:2010-12-19 04:59:33
【问题描述】:
当在 Visual Studio 中编译时,编译器会自行决定输出:
1>生成代码...
它到底在做什么?
【问题讨论】:
标签: c++ visual-studio visual-c++
当在 Visual Studio 中编译时,编译器会自行决定输出:
1>生成代码...
它到底在做什么?
【问题讨论】:
标签: c++ visual-studio visual-c++
Visual Studio 正在调用链接器 LINK.exe,它主要使用目标文件作为输入,以生成可执行文件作为输出,但也能够执行与这些文件和相关文件有关的许多其他工作。 Linker Command-Line Syntax @ MSDN
【讨论】:
编译器一次获得多个输入文件,它一次读取(解析)其中几个文件,然后才为它们生成输出(目标文件),然后再读取更多输入文件。我想这是一种优化,大概是因为对磁盘的混合读/写访问比将它分类为(首先)读访问和(然后)写访问时要慢。
【讨论】:
模板实例(和其他类型的代码)可能会生成代码(或在某些情况下不会)。
【讨论】:
它正在做它所说的:它正在生成机器码。许多编译器将 C/C++ 源代码翻译成一些中间内部表示,然后用作生成实际机器代码的源。 Visual C++ 编译器(与许多其他编译器一样)在批次中执行此操作:首先它将一堆源文件转换为该中间表示,然后将它们全部转换为机器代码(然后开始处理下一批)。当您看到“生成代码”消息时会发生这种情况。
我不知道它究竟是使用什么逻辑将源文件分成批次。也许它只是按大小工作:一旦到目前为止生成的所有中间表示的总大小达到某个限制,它就会切换到“生成代码”模式。也许那里还有其他一些逻辑在起作用。
在任何情况下请注意,在这种情况下,非限定术语“代码”并不指源代码,这意味着它与模板和/或预处理器或类似的东西无关。此外,使用不合格的“代码”(而不是合格的“源代码代码”)引用 C 源代码是一件非常小众的事情,与实际程序员相比,营销部门更熟悉。在程序员的层面上,没有人将 C 源代码仅仅称为“代码”:)
【讨论】: