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 值优化 等机制)。但不是全部。
我想使用 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 值优化 等机制)。但不是全部。