【发布时间】:2018-12-26 03:04:30
【问题描述】:
我目前正在优化我的代码,我有一个关于 std::vector 的问题
我有一个 MyClass 类,我重写了复制/移动构造函数及其相应的运算符。
MyClass(const std::string& id, int x);
MyClass(const MyClass& other);
MyClass(MyClass&& other);
~MyClass();
MyClass& operator=(const MyClass& other);
MyClass& opratror*(MyClass&& other);
我创建了一个向量并尝试了以下
std::vector<MyClass> vec;
MyClass a("A", 1);
vec.push_back(a); //#1
vec.emplace_back("B", 2); //#2
vec.push_back(MyClass("C", 3)); //#3
在 #1 中调用了复制构造函数(我知道向量按值存储,因此它复制 a) 在#2中它保存了一个复制构造函数调用只调用构造函数 在 #3 中它调用构造函数并移动构造函数
但我发现,在向量不为空的 #2、#3 处,每次推回 / emplace / emplace_back 都会触发现有项目的复制/销毁。
在 #2 中,它复制“A”并销毁现有的“A” 在#3中,它对“A”和“B”做同样的事情
似乎每当数组发生变化时,向量都会使用所有项目。 这是否意味着使用类向量会使事情变得低效? 这是使用向量存储指针的最佳解决方案,以便在求助期间没有副本/析构函数调用,只有指针复制?
谢谢
【问题讨论】:
-
进行移动操作
noexcept. -
您是在运行优化的构建,还是“调试”、未优化的构建?您使用哪些编译器选项来构建代码?
-
当向量必须重新分配其内部存储时,它会进行复制,随着它变得越来越大,这种情况发生的频率应该会降低。在得出结论之前,您放手了多大?
-
谢谢大家。我得到了积分!我想我需要更精确地研究 STL。