Index: libcxx/benchmarks/ContainerBenchmarks.h =================================================================== --- libcxx/benchmarks/ContainerBenchmarks.h +++ libcxx/benchmarks/ContainerBenchmarks.h @@ -26,6 +26,40 @@ } } +template +__attribute__((noinline)) +int CopyContainer(Container v1) { + auto v = v1; + return 0; +} + +template +__attribute__((noinline)) +int CopyContainerInto(const Container &v1, Container &v2) { + v2 = v1; + return 0; +} + +template +void BM_CopyConstruct(benchmark::State& st, Container) { + auto size = st.range(0); + Container c(size); + for (auto _ : st) { + auto v = CopyContainer(c); + DoNotOptimizeData(v); + } +} + +template +void BM_CopyContainerInto(benchmark::State& st, Container) { + auto size = st.range(0); + Container c(size); + for (auto _ : st) { + auto v = CopyContainer(c); + DoNotOptimizeData(v); + } +} + template void BM_ConstructSizeValue(benchmark::State& st, Container, typename Container::value_type const& val) { const auto size = st.range(0); Index: libcxx/benchmarks/vector_operations.bench.cpp =================================================================== --- libcxx/benchmarks/vector_operations.bench.cpp +++ libcxx/benchmarks/vector_operations.bench.cpp @@ -17,6 +17,14 @@ vector_byte, std::vector{})->Arg(5140480); +BENCHMARK_CAPTURE(BM_CopyConstruct, + vector_int, + std::vector{})->Arg(5140480); + +BENCHMARK_CAPTURE(BM_CopyContainerInto, + vector_int, + std::vector{})->Arg(5140480); + BENCHMARK_CAPTURE(BM_ConstructSizeValue, vector_byte, std::vector{}, 0)->Arg(5140480);