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 [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/protobuf/44ba623f-d25f-43e9-a0e0-8e2739eb330c%40googlegroups.com.