你好,我是Visual C++代码生成和优化团队的Jerry Goodwin,有两个关于使用整个程序优化的快速提示,也称为链接时间代码生成(LTCG)。
如果您编写的是本地C++代码,通常可以通过将/GL标记添加到编译程序中来加快优化代码的3-4%。 这个标志告诉编译器延迟代码生成,直到你链接你的程序。然后在链接时,链接器回调编译器以完成编译。如果以这种方式编译所有源代码,编译器将优化整个程序,而不是一次优化一个源文件。对于使用IDE构建的用户,在C/C++优化设置下找到此选项,默认情况下,新项目中的零售版本已经默认设置。
使用全程序优化为优化器提供了许多额外的优化机会,但我只举一个例子。许多人已经熟悉将被调用函数内联到调用者中的好处。我们只能在同时为调用函数和被调用函数生成代码时进行内联。使用链接时代码Gen,我们可以将一个源文件中的函数内联到另一个源文件中定义的调用程序中,只要这两个源文件都是用/GL编译的。
如果使用/GL,请记住以下四个注意事项:
1. 当从命令行或通过makefiles构建时,需要将/LTCG开关添加到link命令行,以告诉链接器希望看到使用/GL编译的一个或多个对象文件。如果不这样做,则会浪费一些构建时间,因为链接器在到达使用/GL编译的模块时必须重新启动。如果您通过IDE进行构建,这将在链接器优化页面上的项目配置设置中进行。
2. 使用/GL可以减少编译时间,但是链接时间会增加,因为在链接过程中工作被移动到。总体构建时间可能会增加一点,但不会增加很多。
3. 不要用/GL编译托管代码。链接时代码生成对托管代码几乎没有好处,而且此选项组合(/GL/clr)将在下一个编译器版本中删除,因此您可以通过仅对本机代码使用链接时代码生成来验证您的构建。如果您使用IDE构建托管代码,默认设置是在发布版本中使用/GL,我建议您对托管代码禁用它。对于混合托管代码和本机代码,仅使用/GL编译本机代码并使用/LTCG链接可以获得最佳结果。
4. 不要将/GL用于您打算放入库并发送给客户的代码。这样做意味着您的客户在链接应用程序时将为您的库生成代码。由于您的一些客户可能拥有不同版本的编译器,因此以这种方式构建的lib可能会给您带来各种维护问题。如果您客户的编译器来自以前的版本,他们的链接可能会失败。如果他们的版本比你的版本更新,他们生成的代码将与你测试的代码不完全相同,而且他们的行为可能与你测试时不同。在VS2008中,类库模板发行版配置的IDE默认值是使用/GL构建,我强烈建议大家重新设置它。
以下是有关此主题的更多信息的链接:
/GL编译器开关 ( http://msdn.microsoft.com/en-us/library/0zza0de8.aspx )
/LTCG链接器开关 ( http://msdn.microsoft.com/en-us/library/xbf3tbeh.aspx )
一篇关于链接时间代码生成的详细文章 ( http://msdn.microsoft.com/en-us/magazine/cc301698.aspx )