gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:47:32 24 4
gpt4 key购买 nike

我无法为这个问题想出更合适的名称,但我认为下面的示例会很清楚。

之间的根本区别(内存方面)是什么:

  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);

现在,如果我没有假设有什么不对的话,在我看来,在这两种情况下,都有一个客户端与 DLL 链接,调用一个方法(在 boost 情况下,它是 vector::vector() c'tor) 分配动态内存。

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

所以:

  • 1 和 2 之间的根本区别(内存方面)是什么?两种情况在 memory-accorss-dll 方面是否相同?如果是,请说明如何。
  • 如果它们不相同,为什么有人会建议跨 DLL 分配新对象而不是按照我上面提到的“boost ”方式(如果可能)。
  • 如果我想编写自己的容器并将其放入单独的 DLL 中,它的哪些部分应该“__declspec(dllexport)ed”?这是否意味着内存将跨 DLL 移动(假设我的容器分配动态内存)?

欢迎就此主题进行任何澄清。非常感谢。

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

最佳答案

在堆分配方面,我看不出有什么不同。在这两种情况下,您都会在堆上分配一个类实例。堆中的实例化对象应该占用相同数量的内存,无论它是在主要可执行文件还是库中实例化。

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

关于c++ - 如果对象是在 DLL/Lib 中定义的,是否可以在客户端实例化对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28527826/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com