return move-assignment dequeue optimization

This commit is contained in:
2022-08-12 23:53:22 +03:00
parent 00f7a24d54
commit 67561636e5
2 changed files with 29 additions and 8 deletions

View File

@@ -2554,7 +2554,7 @@ private:
template<typename T1 = T, typename std::enable_if< template<typename T1 = T, typename std::enable_if<
!std::is_trivially_copyable<T1>::value !std::is_trivially_copyable<T1>::value
, int>::type = 0> , int>::type = 0>
inline void elementNew(T * to, T && from) {new(to)T(from);} inline void elementNew(T * to, T && from) {new(to)T(std::move(from));}
template<typename T1 = T, typename std::enable_if< template<typename T1 = T, typename std::enable_if<
std::is_trivially_copyable<T1>::value std::is_trivially_copyable<T1>::value
, int>::type = 0> , int>::type = 0>

View File

@@ -2,28 +2,41 @@
#include "piiostream.h" #include "piiostream.h"
#include "pibytearray.h" #include "pibytearray.h"
#include <vector> #include <vector>
#include <list>
using namespace PICoutManipulators; using namespace PICoutManipulators;
#define SZ 256
class A { class A {
public: public:
A() : id_(666) {
arr = new int[SZ];
piCout << "def A()" << id_ << this << arr;
}
A(int id) : id_(id) { A(int id) : id_(id) {
piCout << "A()" << id_ << this; arr = new int[SZ];
piCout << "A(int)" << id_ << this << arr;
} }
A(const A & a) { A(const A & a) {
arr = new int[SZ];
id_ = a.id_; id_ = a.id_;
piCout << "A(A)" << id_ << this; piCout << "A(A)" << id_ << this << arr;
} }
A(A && a) { A(A && a) {
std::swap(id_, a.id_); std::swap(id_, a.id_);
piCout << "move A(A)" << id_ << this; std::swap(arr, a.arr);
piCout << "move A(A)" << id_ << this << arr;
} }
~A() { ~A() {
piCout << "~A()" << id_ << this; if (arr) {
memset(arr, 0, SZ * 4);
delete arr;
}
piCout << "~A()" << id_ << this << arr;
//id_ = 0; //id_ = 0;
} }
@@ -35,11 +48,13 @@ public:
inline A & operator =(A && a) { inline A & operator =(A && a) {
std::swap(id_, a.id_); std::swap(id_, a.id_);
std::swap(arr, a.arr);
piCout << "move A=" << id_ << this; piCout << "move A=" << id_ << this;
return *this; return *this;
} }
private: private:
int id_; int id_ = -1;
int * arr = 0;
}; };
@@ -62,15 +77,21 @@ int main(int argc, char * argv[]) {
piCout << "pip 3.1"; piCout << "pip 3.1";
{ {
PIDeque<A> v; PIDeque<A> v;
//A a;
//v.push_back(a);
//v.push_back(std::move(a));
v.push_back(A(1)); v.push_back(A(1));
// v.push_back(A(2)); v.push_back(A(2));
v.push_back(A(3));
} }
piCout << "";
piCout << "std"; piCout << "std";
{ {
std::vector<A> v; std::vector<A> v;
v.push_back(A(1)); v.push_back(A(1));
// v.push_back(A(2)); v.push_back(A(2));
v.push_back(A(3));
} }
return 0; return 0;
} }