【发布时间】:2019-01-16 20:03:24
【问题描述】:
假设我正在尝试创建“不可变”类对象(即成员变量是用const 定义的)。因此,在调用构造函数时,我当前调用单独的 init 函数来初始化类成员。但结果似乎有很多新的矢量创建和矢量复制正在进行。
如果成员不是const,我可以在构造函数的{ } 部分执行初始化并直接写入values(我认为这样会更有效)。但这是不可能的。
是否有更好/更清洁/更有效的方法来设计不可变类的构造?
#include <vector>
class Data
{
public:
const std::vector<int> values;
Data(unsigned int size, int other) : values(init(size, other)) { }
Data(const std::vector<int>& other) : values(init(other)) { }
private:
std::vector<int> init(unsigned int size, int other) {
std::vector<int> myVector(size);
for (unsigned int i = 0; i < size; ++i)
myVector[i] = other * i;
return myVector;
}
std::vector<int> init(const std::vector<int>& other) {
std::vector<int> myVector(other);
for (unsigned int i = 0; i < other.size(); ++i)
myVector[i] *= myVector[i] - 1;
return myVector;
}
};
int main() {
Data myData1(5, 3); // gives {0, 3, 6, 9, 12}
Data myData2({2, 5, 9}); // gives {2, 20, 72}
return 0;
}
【问题讨论】:
-
为什么你认为有很多抄袭?你有没有对任何东西进行基准测试?
-
我希望来自
init()的本地向量被移动到成员中,应该没有复制。
标签: c++ performance c++11 vector constructor