2012年4月22日星期日

紧耦合的DLL /松耦合的DLL?

Tightly coupled DLL, Loosely coupled DLL应该翻译成为紧耦合/松耦合的DLL? 我不知道,最近在stackoverflow上看到一个问题的很好的回答,这个回答也谈到了Tightly coupled DLL, Loosely coupled这个问题,这里做一个非常简单的翻译:
其实所谓的紧耦合的DLL(Tightly coupled DLL)也就是:DLL是建立具有完全相同的编译器版本,包装和调用约定设置,应用程序的库选项,两个动态链接到运行时库(/ MD编译器选项)。这可以让对象传递包括STL容器,从应用程序内部分配DLL对象,从其他模块中派生基类。但是其实也可以不使用DLL做到这些。紧耦合的DLL的缺点是,不可以让DLL设置独立于主应用程序(main application)。两者都必须一起构建。这里使用DLL仅仅只是提高的进程的启动时间,因为应用程序可以先启动运行,然后再加载的DLL(使用/delayload链接器选项)。构建时间也相对单一模块快,尤其是使用对整个程序的优化。但优化不会跨越应用程序的DLL边界。任何不特殊的变化仍然需要重新构建。

松散耦合(Loosely coupled DLL):应用程序不依赖于DLL中定义的对象类布局。这里只使用高度兼容的数据类型,例如:原始类型(primitive types),指针(pointers),函数指针(function pointers),或由这些元素组成的用户定义的类型。类只继承一个基类,这个基类定义了接口,并没有任何数据成员,并没有非虚函数(non-virtual functions)(这意味着没有构造体(constructors)和没有共享标准库的对象如std::string或CString)。所有的分配和创建对象,必须通过一个工厂函数(factory function)。内存必须对已分配的模块释放。代码和数据是分开的。头文件中明确规定每个导出的函数和调用约定,还有允许跨模块边界的每个包装结构。它的优点是DLL和应用程序可以完全独立的更新。可以重新构建一个DLL或应用程序并使用新的运行时库,或新的编译器版本,甚至使用一个全新的语言。