I am using unsafe_arena_set_allocated_* and unsafe_arena_release_* APIs to avoid unnecessary allocations when the sub-objects are only used in a function scope, unsafe_arena_release_* is always called before leaving the scope. At the beginning,
I chose to always use the arena versions of unsafe APIs because the non-arena version unsafe_release does extra allocation when the object is allocated on arena, and the arena version does not check if the object is allocated in arena, based on generated code like the following: inline foo* outter1::unsafe_arena_release_foo() { foo* temp = foo_; foo_ = nullptr; return temp; } However, I later also saw the following the generated code with arena check, it means it is not okay to call for heap-allocated objects. inline void outter2::unsafe_arena_set_allocated_bar( std::string* bar) { GOOGLE_DCHECK(GetArenaNoVirtual() != nullptr); ... ... } So, why the discrepancy? The official documentation at https://developers.google.com/protocol-buffers/docs/reference/arenas says the correct set of APIs should be used according to how to the object is allocated, but having two different sets of unsafe APIs makes it harder to use, and it makes the code less robust to future changes. I am wondering if protobuf owners also realize such an issue and start to remove arena checking gradually? It that the case? I would like to hear how others think. Thanks. -- You received this message because you are subscribed to the Google Groups "Protocol Buffers" group. To unsubscribe from this group and stop receiving emails from it, send an email to protobuf+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/protobuf/44ba623f-d25f-43e9-a0e0-8e2739eb330c%40googlegroups.com.