From 39cbd6578fbf3a98d8a213c8ec3f5147557d065e Mon Sep 17 00:00:00 2001 From: Sebastien Boisvert Date: Thu, 11 Jun 2020 23:43:25 +0000 Subject: Fix #1911: add benchmark for move semantics with fixed-size matrix $ clang++ -O3 bench/bench_move_semantics.cpp -I. -std=c++11 \ -o bench_move_semantics $ ./bench_move_semantics float copy semantics: 1755.97 ms float move semantics: 55.063 ms double copy semantics: 2457.65 ms double move semantics: 55.034 ms --- test/rvalue_types.cpp | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) (limited to 'test/rvalue_types.cpp') diff --git a/test/rvalue_types.cpp b/test/rvalue_types.cpp index 1e1f8560a..2eef47d1f 100644 --- a/test/rvalue_types.cpp +++ b/test/rvalue_types.cpp @@ -10,6 +10,9 @@ #define EIGEN_RUNTIME_NO_MALLOC #include "main.h" +#if EIGEN_HAS_CXX11 +#include "MovableScalar.h" +#endif #include @@ -75,11 +78,43 @@ void rvalue_transpositions(Index rows) Eigen::internal::set_is_malloc_allowed(true); } + +template +void rvalue_move(const MatrixType& m) +{ + // lvalue reference is copied + MatrixType b(m); + VERIFY_IS_EQUAL(b, m); + + // lvalue reference is copied + MatrixType c{m}; + VERIFY_IS_EQUAL(c, m); + + // lvalue reference is copied + MatrixType d = m; + VERIFY_IS_EQUAL(d, m); + + // rvalue reference is moved + MatrixType e_src(m); + VERIFY_IS_EQUAL(e_src, m); + MatrixType e_dst(std::move(e_src)); + VERIFY_IS_EQUAL(e_src, MatrixType()); + VERIFY_IS_EQUAL(e_dst, m); + + // rvalue reference is moved + MatrixType f_src(m); + VERIFY_IS_EQUAL(f_src, m); + MatrixType f_dst = std::move(f_src); + VERIFY_IS_EQUAL(f_src, MatrixType()); + VERIFY_IS_EQUAL(f_dst, m); +} #else template void rvalue_copyassign(const MatrixType&) {} template void rvalue_transpositions(Index) {} +template +void rvalue_move(const MatrixType&) {} #endif EIGEN_DECLARE_TEST(rvalue_types) @@ -106,5 +141,9 @@ EIGEN_DECLARE_TEST(rvalue_types) CALL_SUBTEST_3((rvalue_transpositions >(internal::random(1,EIGEN_TEST_MAX_SIZE)))); CALL_SUBTEST_4((rvalue_transpositions >(internal::random(1,EIGEN_TEST_MAX_SIZE)))); CALL_SUBTEST_4((rvalue_transpositions >(internal::random(1,EIGEN_TEST_MAX_SIZE)))); + +#if EIGEN_HAS_CXX11 + CALL_SUBTEST_5(rvalue_move(Eigen::Matrix,1,3>::Random().eval())); +#endif } } -- cgit v1.2.3