【问题标题】:JsonCpp heap object handling memory managementJsonCpp 堆对象处理内存管理
【发布时间】:2017-08-21 18:39:48
【问题描述】:

使用 JsonCpp,我想在嵌入式设备上序列化具有有限堆栈资源的大对象。我发现的所有示例都使用将相互复制的堆栈对象(我猜)。我想一直减少复制 Json::Value 对象,但仍然使用集群代码——这样每个对象只需要知道如何序列化自己。我准备了一个最小的例子,它指向这个答案https://stackoverflow.com/a/42829726中描述的内存管理

但在我的示例中(最后)仍然存在不需要/想要的副本:

(*p)["a"] = *a.toJson(); // value will be copied into new instance

可以通过 JsonCpp 以某种方式避免这种情况吗?

    struct itoJson
    {
        std::shared_ptr<Json::Value> toJson();
    };

    struct A: itoJson
    {
        int i;
        std::shared_ptr<Json::Value> toJson()
        {
          std::shared_ptr<Json::Value> p = std::shared_ptr<Json::Value>(new Json::Value());
          (*p)["i"] = i;
          return p;
        }
    };

    struct B: itoJson
    {
        int x;
        A a;

        std::shared_ptr<Json::Value> toJson()
        {
          std::shared_ptr<Json::Value> p = std::shared_ptr<Json::Value>(new Json::Value());
          (*p)["x"] = x;
          (*p)["a"] = *a.toJson();  // value will be copied into new instance
          return p;
        }
    };

【问题讨论】:

  • 你为什么使用shared_ptrs?返回 Json::Value 而不是 std::shared_ptr&lt;Json::Value&gt;,您的代码应该会变得更简单、更快。
  • 假设“堆栈对象”是指具有自动存储持续时间的对象,这是错误的;这里有很多动态分配,有些在你自己的代码中。
  • @nwp 我没有得到你的评论,因为我的问题完全是关于Json::Value @BoundaryImposition 通常我在谈到堆栈和堆对象时感觉正确,我认为我们的意思是一样的,你能给我一个提示是查找正确的术语吗?
  • 我想你忘了一个词,“不要复制 Json::Value”。虽然看起来Type value = create_value(); 形式的代码会生成副本,但编译器通常足够聪明,可以优化它,即使没有启用优化标志,并让create_value 直接在其最终位置创建值。您正在使用 shared_ptr 禁止该优化。
  • @nwp 啊好的,我明白了,提示传递编译器优化,谢谢。

标签: c++ memory-management jsoncpp


【解决方案1】:

JsonCpp 不支持移动语义 - 这是issue #223

在此之前,您不能完全避免复制。

但是,如果您通过摆脱不必要的动态分配和智能指针来简化代码,您可能会很幸运并看到您的编译器优化了其中的一部分(通过 等机制)返回值优化)。但不是全部。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-18
    • 2021-04-28
    • 2012-03-07
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多