[转]link time code generation

http://blog.csdn.net/ccanan/article/details/6030323

 

http://msdn.microsoft.com/en-us/magazine/cc301698.aspx

在link时刻做的代码优化。

平时接触的编译器优化基本是compile time优化,比如inline这样的工作。

其限制就是可以做的东西就是在一个编译单元里,一旦调用的一个函数在另外一个编译单元,就只有跳转着一个选择,至于跳转的细节就是在link time来决定了。

link time 优化就是在拿到所有编译单元结果了之后,在全局做的一个优化,这时候可以理解成整个编译域变成一个编译单元,很多compile时刻的优化可以linktime做了。

比如inline,调用函数的时候,不用所有的东西都push到stack里,也可以直接放到register里直接调用。

或者更好的thread local storage的reference。

我在查看asm的时候还发现过把一样的函数合并,比如void func0();void func1();编译出来是一个东西,但是不在一个编译单元里,link time code generation会把向两个函数跳转的语句变成像一个地方跳转。

不好的地方就是编译时间变慢很多,所以shipping的时候带着ltcg(link time code generation)是不错的选择,平时开发的时候就算了吧。

 

=============================================================================

http://blog.csdn.net/chengzi/article/details/256582

 

The Key:
C++ 程序正常的代码生成包括三个步骤:
1. 前端,C1, 读取源代码,产生符号表,分析源代码,检查语法正确性,产生某种中间代码(IL)。调用后端。
2. 后端,C2, 代码生成器,读取IL,产生针对CPU的具体代码,代码优化,产生包括实际代码和数据的obj文件。
3. 链接,Linker,读取所有的obj文件和lib文件,建所有的代码和数据合成到最终的.exe可执行文件中。


LTCG - Link-time Code Generation 链接时代码生成
1. 前端C1直接产生 IL 的 obj 文件。不调用C2。
2. Linker读取所有的 IL obj 文件和 lib 文件,调用C2,将所有的 IL 代码塞给C2以产生最终的实际代码。
好处:因为C2可以得到所有的代码,它可以进行更好的代码优化,更好的 inline (跨模块,跨源文件的 inline),和 TLS优化。


怎样打开LTCG?
1. 在 VC.NET IDE 中,将Whole Program Optimization 设置为 Yes。
2. 命令行参数,编译器使用 /GL, 链接时使用参数 /LTCG

posted @   Pulaski  阅读(980)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示