哪个是重置功能的更好做法?
Which is a better practice for a reset function?
编辑:MyClass
只是一个例子。问题实际上是关于如何重置class的部分成员。在我的实际情况下,class 更复杂,data
将长达一百万。另外,我有 copy/move 个 c'tors 和运算符,在我的示例中省略了它们。
我有一个class
class MyClass{
double *data;
int data_length;
MyClass() : data(nullptr), data_length(0){}
~MyClass(){
if(data != nullptr){
delete[] data;
}
}
}
现在我想添加一个新的成员函数reset()
。
以下哪项是更好的做法?
(一)
MyClass::reset(double* in_data, int in_length){
if(data != nullptr){
delete[] data;
}
data = new double[in_length];
memcpy(data, in_data, in_length * sizeof(double));
data_length = in_length;
}
和
(b)
MyClass::reset(double* in_data, int in_length){
if(data != nullptr){
delete[] data;
}
data = in_data;
data_length = in_length;
}
看来(a)比较安全,但是比较费时,而且(a)的clients在调用reset()
后还得手动删除tempin_data
。 (b)效率更高,但是有风险,客户端可能会在外面删除in_data
。
最好复制数据,不要依赖外部世界来获得这些东西,尤其是当你有一个析构函数来删除 class 没有分配的内存时。
刚好有一个数据成员:
std::vector<double> data;
然后:
void reset(std::vector<double>&& new_data) { data = std::move(new_data); }
void reset(const std::vector<double>& new_data) { data = new_data; }
如果隐式允许或您使用 std::move()
在调用代码中明确授予权限,上面的第一个重载将从即将到期的 vector<>
移动数据,否则第二个重载将复制:
myClass.reset(get_new_data_vector()); // moves returned vector
std::vector x = { ... };
myClass.reset(x); // do a full "deep" copy
myClass.reset(std::move(x)); // explicitly allow move from named local var
如果您有其他数据集,您可以对每个数据集执行类似的操作 - 每个数据集都可以高效且独立地更新。
编辑:MyClass
只是一个例子。问题实际上是关于如何重置class的部分成员。在我的实际情况下,class 更复杂,data
将长达一百万。另外,我有 copy/move 个 c'tors 和运算符,在我的示例中省略了它们。
我有一个class
class MyClass{
double *data;
int data_length;
MyClass() : data(nullptr), data_length(0){}
~MyClass(){
if(data != nullptr){
delete[] data;
}
}
}
现在我想添加一个新的成员函数reset()
。
以下哪项是更好的做法?
(一)
MyClass::reset(double* in_data, int in_length){
if(data != nullptr){
delete[] data;
}
data = new double[in_length];
memcpy(data, in_data, in_length * sizeof(double));
data_length = in_length;
}
和
(b)
MyClass::reset(double* in_data, int in_length){
if(data != nullptr){
delete[] data;
}
data = in_data;
data_length = in_length;
}
看来(a)比较安全,但是比较费时,而且(a)的clients在调用reset()
后还得手动删除tempin_data
。 (b)效率更高,但是有风险,客户端可能会在外面删除in_data
。
最好复制数据,不要依赖外部世界来获得这些东西,尤其是当你有一个析构函数来删除 class 没有分配的内存时。
刚好有一个数据成员:
std::vector<double> data;
然后:
void reset(std::vector<double>&& new_data) { data = std::move(new_data); }
void reset(const std::vector<double>& new_data) { data = new_data; }
如果隐式允许或您使用 std::move()
在调用代码中明确授予权限,上面的第一个重载将从即将到期的 vector<>
移动数据,否则第二个重载将复制:
myClass.reset(get_new_data_vector()); // moves returned vector
std::vector x = { ... };
myClass.reset(x); // do a full "deep" copy
myClass.reset(std::move(x)); // explicitly allow move from named local var
如果您有其他数据集,您可以对每个数据集执行类似的操作 - 每个数据集都可以高效且独立地更新。