在序列化期间删除不必要的内存分配
Remove unnecessary memory allocation during serialization
我有一个包装器 class 作为私有成员持有一个 protobuf,myInstance
。 protobuf 包含一个 optional bytes payload
,我想在包装器 class 中使用函数模板进行设置(使包装器 class 有效负载不可知,直到模板实例化)。
我在包装器中写了这个 set_payload 函数 class:
template <typename T>
inline void set_payload(const T& somePayload)
{
uint32_t payloadSize = somePayload.ByteSize();
uint8_t* serializedPayload = new uint8_t[payloadSize];
somePayload.SerializeToArray(serializedPayload, payloadSize);
myInstance->set_payload(serializedPayload, payloadSize);
delete [] serializedPayload;
}
此函数可以获取任何 protobuf 并将其序列化到包装器 class.
内 myInstance
的 payload
成员中
我的问题是额外的内存分配步骤。我想删除函数模板中 new 和 delete 的使用,因为无论如何都会为 myInstance::payload
分配内存。可能吗?
函数的标识本来可以是 inline void set_payload(const ::google::protobuf::Message& somePayload)
,而不是模板。相同的实现。
Protobuf 现在有 移动感知 setters 接受右值引用。
为了对payload
使用移动感知setter,你需要做这样的事情:
制作serializedPayload
一个std::string
std::string payload;
将其增长到需要的大小:
payload.resize(payloadSize);
序列化其数据:
somePayload.SerializeToArray(payload.data(), payloadSize); // c++17, or
somePayload.SerializeToArray(&payload[0], payloadSize); // c++<17
调用移动感知setter:
myInstance->set_payload(std::move(serializedPayload), payloadSize);
我有一个包装器 class 作为私有成员持有一个 protobuf,myInstance
。 protobuf 包含一个 optional bytes payload
,我想在包装器 class 中使用函数模板进行设置(使包装器 class 有效负载不可知,直到模板实例化)。
我在包装器中写了这个 set_payload 函数 class:
template <typename T>
inline void set_payload(const T& somePayload)
{
uint32_t payloadSize = somePayload.ByteSize();
uint8_t* serializedPayload = new uint8_t[payloadSize];
somePayload.SerializeToArray(serializedPayload, payloadSize);
myInstance->set_payload(serializedPayload, payloadSize);
delete [] serializedPayload;
}
此函数可以获取任何 protobuf 并将其序列化到包装器 class.
内myInstance
的 payload
成员中
我的问题是额外的内存分配步骤。我想删除函数模板中 new 和 delete 的使用,因为无论如何都会为 myInstance::payload
分配内存。可能吗?
函数的标识本来可以是 inline void set_payload(const ::google::protobuf::Message& somePayload)
,而不是模板。相同的实现。
Protobuf 现在有 移动感知 setters 接受右值引用。
为了对payload
使用移动感知setter,你需要做这样的事情:
制作
serializedPayload
一个std::string
std::string payload;
将其增长到需要的大小:
payload.resize(payloadSize);
序列化其数据:
somePayload.SerializeToArray(payload.data(), payloadSize); // c++17, or somePayload.SerializeToArray(&payload[0], payloadSize); // c++<17
调用移动感知setter:
myInstance->set_payload(std::move(serializedPayload), payloadSize);