JsonCpp堆对象处理内存管理

JsonCpp heap object handling memory management

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

定位到描述的内存管理

但是在我的例子中(最后)还有一个不是needed/wanted copy:

(*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;
        }
    };

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

在此之前,您无法完全避免复制。

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