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

时间:2017-06-08 06:36:06

标签: c++ protocol-buffers

我有一个包装类,它将protobuf作为私有成员myInstance。 protobuf包含一个optional bytes payload我想在包装类中使用函数模板进行设置(使包装类有效负载不可知,直到模板实例化)。

我在包装类中编写了这个set_payload函数:

  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并将其序列化到包装类内payload的{​​{1}}成员中。

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

该函数的身份可能是myInstance::payload,而不是模板。相同的实现。

1 个答案:

答案 0 :(得分:1)

Protobuf现在有移动感知的setter 接受rvalue引用。

要为payload使用移动感知设置器,您需要执行以下操作:

  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. 调用move-aware setter:

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