我想进一步详尽地讨论这个话题。
假设我有类似的东西:
class MyClass
{
public:
MyClass(int N)
{
data_ptr = new float[N];
};
float* dat_ptr;
// ... clever operator definition here ...
};
所以我希望能够简单地写:
MyClass a(4);
MyClass b(4);
MyClass c(4);
// modify b.data_ptr and c.data_ptr ....
// Use "clever operator"
a = b + c;
操作符将执行 a.data_ptr[i] = b.data_ptr[i] + c.data_ptr[i] for i=0:(N-1) ...
因此,不会创建额外的数据拷贝,并且我们巧妙地使用预分配的缓冲区。
这可能吗?如果是这样,请向我提供一些关于如何完成的见解。
谢谢!
最佳答案
如果您使用 C++11 中的移动语义,则可以。
class MyClass
{
public:
MyClass(int N)
{
data_ptr = new float[N];
n = N;
}
MyClass(MyClass && rhs)
{
data_ptr = rhs.data_ptr;
n = rhs.n;
rhs.data_ptr = nullptr;
}
// dtor, copy-ctor etc.
int n;
float * dat_ptr;
};
MyClass operator + (const MyClass & left, const MyClass & right)
{
MyClass result(left.n);
// Implement addition
}
// Note: no error-checking
这样会创建一个临时对象,但内部数据不会被不必要地复制。
阅读more关于移动语义。
关于用于处理 a = b + c 的 C++ 运算符语法,无需显式复制 "a.data_ptr"中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16810071/