diff --git a/rmw_zenoh_cpp/src/detail/zenoh_utils.cpp b/rmw_zenoh_cpp/src/detail/zenoh_utils.cpp index 5fe1fbcd..8145ef7c 100644 --- a/rmw_zenoh_cpp/src/detail/zenoh_utils.cpp +++ b/rmw_zenoh_cpp/src/detail/zenoh_utils.cpp @@ -80,6 +80,14 @@ int64_t get_system_time_in_ns() ///============================================================================= Payload::Payload(const zenoh::Bytes & bytes) { + // NOTE(fuzzypixelz): `zenoh::Bytes` is an list of reference-couted buffers. When the list of + // buffers contains exactly one element, it is not necessary to concatenate the list of buffers. + // In this case, we store a clone of the bytes object to maintain a non-zero reference-count on + // the buffer. This ensures that the slice into said buffer stays valid until we drop our copy + // of the bytes object (at the very least). This case corresponds to the `Contiguous` + // alternative of the `bytes_` variant and aims to optimize away a memcpy during "session-local" + // communication. + zenoh::Bytes::SliceIterator slices = bytes.slice_iter(); std::optional slice = slices.next(); if (!slice.has_value()) {