簡體   English   中英

在協議緩沖區中,如何在競技場內“放置新”?

[英]In protocol buffers how to `placement new` inside an arena?

基本上任何 object 都可以使用 google::protobuf::Arena::Create 在競技場上創建。 如何分配另一個 object 來代替已經分配的 object? 我嘗試了以下方法:

class My_stuff{};

int main(){
  google::protobuf::Arena arena;
  My_stuff* ptr = google::protobuf::Arena::Create<My_stuff>(&arena);
  ptr = google::protobuf::Arena::Create<My_stuff>(&arena); /* Does this not duplicate the allocated data? */

  return 0;
}

這不會重復數據嗎? 如果無法在 object 的位置進行分配,如何從競技場中刪除 object? 在消息的情況下,它非常簡單,因為可以使用release_message方法。

對於消息,沒有記錄從 Arena 中刪除的方法,但是Swap()可以將一條消息替換為另一條消息。

根據文檔,對於消息中的RepeatedFields

當啟用競技場分配時,添加了以下方法或具有一些特殊行為。 否則,訪問器方法只使用默認行為。

Bar* release_foo() :如果已設置,則返回該字段的現有子消息實例,如果未設置,則返回 NULL 指針,將此實例的所有權釋放給調用者並清除父消息的字段。 Arena 支持添加了額外的復制語義來維護返回的 object 始終是堆分配的協定:

  • 如果父消息在 arena 上,此方法將在堆上復制子消息,清除字段值並返回副本。
  • 如果父消息在堆上,則方法行為不變。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM