所谓的dll,无非是将不必用到的模块源码、资源、数据(静态的)等剥离出主程序的一种解决方案。由于工程越来越大,想把所有的东东都编译进exe,会使exe膨胀得厉害,占用内存太大,所以采用这种解决方案。
刚才讲了,为什么不把dll所有用到的数据都剥离出来呢?答案是没必要。dll总是附属于exe(或者说宿主进程)才能运行,堆栈数据完全可以采用与exe同等的空间,这样系统管理起来方便,不用再分dll堆栈和exe堆栈。
每一个进程仅仅对应dll一个静态变量实例,所有多线程访问时必须注意同步问题。
至于静态与动态调用的区别:静态调用实际上是换一种方式的静态链接库(lib)。与lib一样,exe运行之前,所有东西都编译进exe了。所以,没有编译之前如果把dll去掉了,编译肯定会报错。个人觉得动态调用(或者称显示调用)才具备动态连接库真正的工程意义:运行时加载。