From 1a2c8163e81a0464b04cad0c01e3740e258d3abb Mon Sep 17 00:00:00 2001 From: Ivan Babrou Date: Fri, 10 Oct 2025 19:09:55 -0700 Subject: [PATCH] Properly size the destination in flatten_segments We've observed unexpected reallocations on some flamegraphs here. --- capnp/src/serialize.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/capnp/src/serialize.rs b/capnp/src/serialize.rs index 803303e23..0290a7f06 100644 --- a/capnp/src/serialize.rs +++ b/capnp/src/serialize.rs @@ -536,7 +536,7 @@ where #[cfg(feature = "alloc")] fn flatten_segments(segments: &R) -> alloc::vec::Vec { - let word_count = compute_serialized_size(segments); + let word_count = compute_serialized_size(segments) * BYTES_PER_WORD; let segment_count = segments.len(); let table_size = segment_count / 2 + 1; let mut result = alloc::vec::Vec::with_capacity(word_count); @@ -549,6 +549,10 @@ fn flatten_segments(segments: &R) -> alloc: let segment = segments.get_segment(i as u32).unwrap(); result.extend(segment); } + debug_assert!( + result.capacity() == word_count, + "unexpected result capacity growth" + ); result }