我无法为这个问题提出一个更正确的名称,但我认为下面的例子会清楚。
之间的基本区别(记忆方面)是什么:
包含以下代码的DLL:
class ISDLConsole { /* interface */ };
class SDLConsole: public ISDLConsole { /* implementation */ };
__declspec(dllexport) ISDLConsole *Create()
{
return new SDLConsole();
}
与客户端已动态链接此DLL并调用:
ISDLConsole * pClientSDLConsole = Create();
boost的客户端,它动态地链接它,并使用其中一个容器,如下所示:
boost::numeric::ublas::vector<double> v(1000);
现在,如果我没有做错,那么在我看来,在两种情况下都有一个与DLL链接的客户端,调用一个方法(在增强情况下它是&#39; s vector :: vector()c&#39; tor)分配动态内存。
我认为用ISDLConsole * pClientSDLConsole = Create();
替换ISDLConsole * pClientSDLConsole = new SDLConsole();
会更好(如果可能的话,导出类本身)并仅在客户端分配内存,对吗?
所以:
对此主题的任何澄清都非常受欢迎。 非常感谢你。
答案 0 :(得分:1)
就堆分配而言,我认为没有区别。在这两种情况下,您都会获得在堆上分配的类实例。无论是否在主可执行文件或库中实例化,堆中的实例化对象都应占用相同数量的内存。
就代码而言,我希望在这两种方法之间存在几个字节的差异。背景噪音,我不会关心。
答案 1 :(得分:0)
pClientSDLConsole = new ISDLConsole();
无法编译
因为ISDLConsole是一个接口(抽象类)。 pClientSDLConsole = new SDLConsole();
仅在DLL时编译
开发人员在公共标题中声明了SDLConsole并将其导出。但
它隐藏了隐藏实现的原则。