想想如果我们自己要做编译器(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[转]相关推荐

  1. 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 ...

  2. Qlikview Data Modeling---创建一个Key/Link Table

    这一篇我们将来学习下在什么情况下需要在QlikView里创建一个Key或者Link Table来避免事实表loops 和 qlikview自动产生synthetic keys.当两个事实表共享同样 ...

  3. 浅析VS2010反汇编 VS 反汇编方法及常用汇编指令介绍 VS2015使用技巧 调试-反汇编 查看C语言代码对应的汇编代码...

    浅析VS2010反汇编 2015年07月25日 21:53:11 阅读数:4374 第一篇 1. 如何进行反汇编 在调试的环境下,我们可以很方便地通过反汇编窗口查看程序生成的反汇编信息.如下图所示. ...

  4. Windows下资源泄漏检测

    前言 内存泄露和资源泄露是C\C++程序员不得不面对的一个问题,随着程序越来越大,稍不留神就可能在程序中留下了内存泄露的隐患,这个问题很多人可能觉得没什么,就泄露点内存而已,只要程序逻辑没问题,但是如 ...

  5. 浅析VS2010反汇编

    第一篇 1. 如何进行反汇编 在调试的环境下,我们可以很方便地通过反汇编窗口查看程序生成的反汇编信息.如下图所示. 记得中断程序的运行,不然看不到反汇编的指令 看一个简单的程序及其生成的汇编指令 #i ...

  6. 使用dumpbin查看动态链接库有 函数名=@ILT+数字(函数名)

    问题 #include "testdll.h" int add(int a, int b) { int c = a + b; return c; } .hpp #pragma on ...

  7. 使用flink Table Sql api来构建批量和流式应用(2)Table API概述

    从flink的官方文档,我们知道flink的编程模型分为四层,sql层是最高层的api,Table api是中间层,DataStream/DataSet Api 是核心,stateful Stream ...

  8. 使用flink Table Sql api来构建批量和流式应用(1)Table的基本概念

    从flink的官方文档,我们知道flink的编程模型分为四层,sql层是最高层的api,Table api是中间层,DataStream/DataSet Api 是核心,stateful Stream ...

  9. 数据结构学习笔记(七):哈希表(Hash Table)

    目录 1 哈希表的含义与结构特点 1.1 哈希(Hash)即无序 1.2 从数组看哈希表的结构特点 2 哈希函数(Hash Function)与哈希冲突(Hash Collision) 2.1 哈希函 ...

最新文章

  1. 多线程中的应用之队列(queue)
  2. QT事件 sendEvent()、postEvent()和QObject::customEvent()
  3. Pasha and Phone
  4. 海思芯片硬件java加速_海思芯片直播延迟测试结果(小于100毫秒)
  5. 【转】ASPxGridView 日期范围过滤扩展
  6. Jenkins学习总结(3)——Jenkins+Maven+Git搭建持续集成和自动化部署的
  7. TCP通信之获取本机IPV4地址
  8. 元数据--MySQL获取元数据的方法
  9. 最新布尔教育Blog项目实战 php博客项目实战教程 php实战教程(完整)
  10. 华为HCIA(HCNA)笔记,还不快快收藏!
  11. GO语言-panic和recover
  12. 推荐几个自己用过的软件测试博客论坛
  13. android 开发 安卓系统主题设置
  14. 微信游戏奇迹暖暖选取服务器失败,奇迹暖暖微信怎么登录失败
  15. 标准柯西分布_柯西分布的随机数
  16. 录音转文字工具,支持6大语音识别引擎识别,非常好用的网赚工具!
  17. 10. JavaScript
  18. 字符版本贪吃蛇游戏设计及算法
  19. 我们真的需要会议耳机吗?
  20. 项目管理资格认证PMP考前培训班

热门文章

  1. ACM基础题 - 求矩形个数
  2. C#方法带不确定个数参数
  3. 通过超图在网页中加载3dmax模型
  4. windows令牌学习
  5. mfc 使用画笔画线
  6. 图解VC++开发ActiveX控件C#调用
  7. pytest文档3-pycharm运行pytest
  8. 移动端总结和手机兼容问题
  9. xargs 主要用于不支持管道的shell命令*****
  10. Java学习笔记——Java6开发WebService进阶