如果在DLL / Lib中定义了对象,是否可以在客户端中实例化对象?

时间:2015-02-15 15:42:21

标签: c++ boost dll dllimport dllexport

我无法为这个问题提出一个更正确的名称,但我认为下面的例子会清楚。

之间的基本区别(记忆方面)是什么:

  1. 包含以下代码的DLL:

    class ISDLConsole { /* interface */ };
    class SDLConsole: public ISDLConsole { /* implementation */ };
    __declspec(dllexport) ISDLConsole *Create()
    {
        return new SDLConsole();
    }
    

    与客户端已动态链接此DLL并调用:

    ISDLConsole * pClientSDLConsole = Create();
    
  2. boost的客户端,它动态地链接它,并使用其中一个容器,如下所示:

    boost::numeric::ublas::vector<double> v(1000);

  3. 现在,如果我没有做错,那么在我看来,在两种情况下都有一个与DLL链接的客户端,调用一个方法(在增强情况下它是&#39; s vector :: vector()c&#39; tor)分配动态内存。

    我认为用ISDLConsole * pClientSDLConsole = Create();替换ISDLConsole * pClientSDLConsole = new SDLConsole();会更好(如果可能的话,导出类本身)并仅在客户端分配内存,对吗?

    所以:

    • 1和2之间的根本区别(记忆方面)是什么?两个案例在记忆 - 事件 - dll方面是否相同?如果是这样,请澄清如何。
    • 如果它们不相同,为什么有人会建议在DLL之间分配一个新对象,而不是“升级”#39;我上面提到的方式(如果可能的话)。
    • 如果我想编写自己的容器并将其放在一个单独的DLL中,它的哪些部分应该是&#39; __ declspec(dllexport)ed&#39;?并且它是否意味着将有内存移动到DLL(假设我的容器分配动态内存)?

    对此主题的任何澄清都非常受欢迎。 非常感谢你。

    ISDLConsole示例的来源是this接受的答案,BTW与this接受的答案相矛盾。

2 个答案:

答案 0 :(得分:1)

就堆分配而言,我认为没有区别。在这两种情况下,您都会获得在堆上分配的类实例。无论是否在主可执行文件或库中实例化,堆中的实例化对象都应占用相同数量的内存。

就代码而言,我希望在这两种方法之间存在几个字节的差异。背景噪音,我不会关心。

答案 1 :(得分:0)

  1. 代码pClientSDLConsole = new ISDLConsole();无法编译 因为ISDLConsole是一个接口(抽象类)。
  2. 代码pClientSDLConsole = new SDLConsole();仅在DLL时编译 开发人员在公共标题中声明了SDLConsole并将其导出。但 它隐藏了隐藏实现的原则。
  3. boost :: vector方法根本不同:所有矢量代码 在内联中,没有什么可以导出的。一些提升库不遵循此规则,例如升压::文件系统。