什么是Incremental Link Table[转]
想想如果我们自己要做编译器(compiler)和连接器(linker),当然希望编译连接运行得越快越好,同时也希望产生的二进制代码也是又快又小,上帝是公平的,鱼与熊掌不可兼得,所以我们自然想到用两种build方式,一种Release,编译慢一些,但是产生的二进制代码紧凑精悍,一种Debug,编译运行快,产生的代码臃肿一点没关系,Debug版本嘛,就是指望程序员在开发的时候反复的build,为了不浪费程序员的时候,要想尽办法让编译连接速度变快。
假如一个程序有连续两个 foo 和 bar ( 所谓连续,就是他们编译连接之后函数体连续存放 ) , foo 入口位置在 0x0400 ,长度为 0x200 个字节,那么 bar 入口就应该在 0x0600 = 0x0400+0x0200 。程序员在开发的时候总是频繁的修改 code 然后 build ,假如程序员在 foo 里面增加了一些内容,现在 foo 函数体占 0x300 个字节了, bar 的入口也就只好往后移 0x100 变成了 0x0700 ,这样就有一个问题,如果 foo 在程序中被调用了 n 次,那么 linker 不得不修改这 n 个函数调用点,虽然 linker 不嫌累,但是 link 时间长了,程序员会觉得不爽。所以 MSVC 在 Debug 版的 build ,不会让各个函数体之间这么紧凑,每个函数体后都有 padding (全是汇编代码 int 3 ,作用是引发中断,这样因为古怪原因运行到不该运行的 padding 部分,会发生异常),有了这些 padding ,就可以一定程度上缓解上面提到的问题,不过当函数增加内容太多超过 padding ,还是有问题,怎么办呢? MSVC 在 Debug build 中用上了 Incremental Link Table , ILT 其实就是一串 jmp 语句,每个 jmp 语句对应一个函数, jmp 的目的地就是函数的入口点,和没有 ILT 的区别是,现在对函数的调用不是直接 call 到函数入口点了,而是 call 到 ILT 中对应的位置,而这个位置上什么也不做,直接 jmp 到函数中去。这样的好处是,当一个函数入口地址改变时,只要修改 ILT 中对应值就搞定了,用不着修改每一个调用位置,用一个冗余的 ITL 把时间复杂度从 O(n) 将为 O(1) ,值得,当然 Debug 版的二进制文件会稍大稍慢, Release 版不会用上 ILT 。
什么是Incremental Link Table[转]相关推荐
- WHAT IS ILT(INCREMENTAL LINK TABLE)?
http://mocheng.wordpress.com/2006/07/17/what-is-ilt%EF%BC%88incremental-link-table/ WHAT IS ILT(INCR ...
- Qlikview Data Modeling---创建一个Key/Link Table
这一篇我们将来学习下在什么情况下需要在QlikView里创建一个Key或者Link Table来避免事实表loops 和 qlikview自动产生synthetic keys.当两个事实表共享同样 ...
- 浅析VS2010反汇编 VS 反汇编方法及常用汇编指令介绍 VS2015使用技巧 调试-反汇编 查看C语言代码对应的汇编代码...
浅析VS2010反汇编 2015年07月25日 21:53:11 阅读数:4374 第一篇 1. 如何进行反汇编 在调试的环境下,我们可以很方便地通过反汇编窗口查看程序生成的反汇编信息.如下图所示. ...
- Windows下资源泄漏检测
前言 内存泄露和资源泄露是C\C++程序员不得不面对的一个问题,随着程序越来越大,稍不留神就可能在程序中留下了内存泄露的隐患,这个问题很多人可能觉得没什么,就泄露点内存而已,只要程序逻辑没问题,但是如 ...
- 浅析VS2010反汇编
第一篇 1. 如何进行反汇编 在调试的环境下,我们可以很方便地通过反汇编窗口查看程序生成的反汇编信息.如下图所示. 记得中断程序的运行,不然看不到反汇编的指令 看一个简单的程序及其生成的汇编指令 #i ...
- 使用dumpbin查看动态链接库有 函数名=@ILT+数字(函数名)
问题 #include "testdll.h" int add(int a, int b) { int c = a + b; return c; } .hpp #pragma on ...
- 使用flink Table Sql api来构建批量和流式应用(2)Table API概述
从flink的官方文档,我们知道flink的编程模型分为四层,sql层是最高层的api,Table api是中间层,DataStream/DataSet Api 是核心,stateful Stream ...
- 使用flink Table Sql api来构建批量和流式应用(1)Table的基本概念
从flink的官方文档,我们知道flink的编程模型分为四层,sql层是最高层的api,Table api是中间层,DataStream/DataSet Api 是核心,stateful Stream ...
- 数据结构学习笔记(七):哈希表(Hash Table)
目录 1 哈希表的含义与结构特点 1.1 哈希(Hash)即无序 1.2 从数组看哈希表的结构特点 2 哈希函数(Hash Function)与哈希冲突(Hash Collision) 2.1 哈希函 ...
最新文章
- 多线程中的应用之队列(queue)
- QT事件 sendEvent()、postEvent()和QObject::customEvent()
- Pasha and Phone
- 海思芯片硬件java加速_海思芯片直播延迟测试结果(小于100毫秒)
- 【转】ASPxGridView 日期范围过滤扩展
- Jenkins学习总结(3)——Jenkins+Maven+Git搭建持续集成和自动化部署的
- TCP通信之获取本机IPV4地址
- 元数据--MySQL获取元数据的方法
- 最新布尔教育Blog项目实战 php博客项目实战教程 php实战教程(完整)
- 华为HCIA(HCNA)笔记,还不快快收藏!
- GO语言-panic和recover
- 推荐几个自己用过的软件测试博客论坛
- android 开发 安卓系统主题设置
- 微信游戏奇迹暖暖选取服务器失败,奇迹暖暖微信怎么登录失败
- 标准柯西分布_柯西分布的随机数
- 录音转文字工具,支持6大语音识别引擎识别,非常好用的网赚工具!
- 10. JavaScript
- 字符版本贪吃蛇游戏设计及算法
- 我们真的需要会议耳机吗?
- 项目管理资格认证PMP考前培训班