在序列化期间删除不必要的内存分配

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.

myInstancepayload 成员中

我的问题是额外的内存分配步骤。我想删除函数模板中 new 和 delete 的使用,因为无论如何都会为 myInstance::payload 分配内存。可能吗?

函数的标识本来可以是 inline void set_payload(const ::google::protobuf::Message& somePayload),而不是模板。相同的实现。

Protobuf 现在有 移动感知 setters 接受右值引用。

为了对payload使用移动感知setter,你需要做这样的事情:

  1. 制作serializedPayload一个std::string

    std::string payload;
    
  2. 将其增长到需要的大小:

     payload.resize(payloadSize);
    
  3. 序列化其数据:

    somePayload.SerializeToArray(payload.data(), payloadSize); // c++17, or
    somePayload.SerializeToArray(&payload[0], payloadSize); // c++<17
    
  4. 调用移动感知setter:

    myInstance->set_payload(std::move(serializedPayload), payloadSize);