【问题标题】:Converting and keeping the managed data in memory for a while将托管数据转换并在内存中保存一段时间
【发布时间】:2012-07-28 16:05:03
【问题描述】:

我正在围绕 C++ 项目编写 C++/cli 包装器,以便可以从 C# 调用它。 C#端调用一个cli方法[say Put(String^ key, String^ value)]数百万次传递一大组key/value托管数据,然后再调用[say Commit()]询问C++对象对数据做一些事情。我需要能够将所有数据保存在内存中,直到最后一次调用 - 所以我使用 std::vector 并尝试将所有托管字符串转换为非托管 std::string 并将它们保存在我的 cli 中的向量中代码。

我的问题是——在这种情况下转换托管数据的最佳方法是什么?固定托管数据以保持非托管指针有效似乎是个坏主意,因为数据不会立即使用(如果固定在函数调用后立即超出范围,这也将不起作用 - 这会导致访问失效)。另一种选择是通过 malloc 分配一个“足够大”的缓冲区并继续向其中添加数据——如果这样更好,那么:(1) 是 pin-ptr 后跟一个 memcpy (一旦 Put 方法,固定将超出范围返回)转换/复制单个 String^ 数据的最佳方式? (2)由于我不知道maloc的总大小,从初始malloc扩展内存的最佳方法是什么?我将不胜感激任何指向此场景的良好设计解决方案的指针。

【问题讨论】:

    标签: memory-management c++-cli managed unmanaged-memory


    【解决方案1】:

    如果您需要在使用之前将数据排队,我可能会使用托管容器来执行此操作。您将两个字符串称为“键”和“值”,键是唯一的吗?如果是这样,请使用托管的Dictionary<String^, String^>。如果没有,请使用List<KeyValuePair<String^, String^>>,并在调用 Commit() 时将所有转换为非托管字符串。

    当调用 Commit() 时,您可以使用一个大的 malloc 来保存所有单独的字符串,或者您可以使用许多单独的 malloc(或其他分配方法)单独转换每个字符串。只要您在所有情况下都正确释放内存,任何一个都应该可以正常工作。

    【讨论】:

    • 好吧,虽然这是个好主意,但实际上我需要双倍的内存,对吧?我的意思是,将 N 字节的托管数据保存在字典中直到提交,然后在提交期间 malloc 过程中的另一组 N 字节并复制数据并使用此非托管副本调用 C++ 提交,对吗?我真的希望每次调用 Put() 只进行一次转换,并将非托管数据的一份副本保留在内存中(不必挂在来自 C# 端的托管数据)
    猜你喜欢
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多