Add arena enabled copy construction. Arena enabled copy construction provides efficiency gains for the rather common construct where a message is currently copied by first creating a default initialized instance through the regular (arena) constructor, and then recursively filled from the source message using 'MergeFrom' or 'CopyFrom'. Arena enabled copy construction is feature gated in port_def.inc and currently not enabled by default. PiperOrigin-RevId: 558854125
diff --git a/src/google/protobuf/compiler/cpp/field_generators/primitive_field.cc b/src/google/protobuf/compiler/cpp/field_generators/primitive_field.cc index 8db2b3b..dcd2ecb 100644 --- a/src/google/protobuf/compiler/cpp/field_generators/primitive_field.cc +++ b/src/google/protobuf/compiler/cpp/field_generators/primitive_field.cc
@@ -353,9 +353,11 @@ $field_$.DeleteIfNotDefault(); )cc"); } else { +#ifndef PROTOBUF_EXPLICIT_CONSTRUCTORS p->Emit(R"cc( $field_$.~RepeatedField(); )cc"); +#endif // !PROTOBUF_EXPLICIT_CONSTRUCTORS } } @@ -394,6 +396,31 @@ GenerateCacheSizeInitializer(p); } + void GenerateMemberConstexprConstructor(io::Printer* p) const override { + p->Emit("$name$_{}"); + if (HasCachedSize()) { + p->Emit(",\n_$name$_cached_byte_size_{0}"); + } + } + + void GenerateMemberConstructor(io::Printer* p) const override { + p->Emit("$name$_{visibility, arena}"); + if (HasCachedSize()) { + p->Emit(",\n_$name$_cached_byte_size_{0}"); + } + } + + void GenerateMemberCopyConstructor(io::Printer* p) const override { + p->Emit("$name$_{visibility, arena, from.$name$_}"); + if (HasCachedSize()) { + p->Emit(",\n_$name$_cached_byte_size_{0}"); + } + } + + void GenerateOneofCopyConstruct(io::Printer* p) const override { + ABSL_LOG(FATAL) << "Not supported"; + } + void GeneratePrivateMembers(io::Printer* p) const override; void GenerateAccessorDeclarations(io::Printer* p) const override; void GenerateInlineAccessorDefinitions(io::Printer* p) const override;