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.

Reply via email to