Eliminate RepeatedPtrFieldBase::Rep::allocated_size
: fix slow extending
#23938
+178
−122
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Eliminate
RepeatedPtrFieldBase::Rep::allocated_size
: fix slow extendingFixes the slowdown in the field mutations caused by
memset
ting newly added elements to nulls inRepeatedPtrField::InternalExtend()
:memset
ting the entire new array, sets only one or at most two sentinel elements to nulls.InternalExtend()
. This is used to terminate several for-loops that previously relied onallocated_size()
, and to reimplementallocated_size()
(nowAllocatedSize()
because it's now slower and no longer trivial) for just a couple remaining places that still use the value.Capacity()
, also when there is an unallocated gap and possibly coinciding with the other sentinel if the gap is just 1 element. This sentinel is used to determine if the fuild has unallocated elements.allocated_size()
now move the sentinels in the appropriate direction.