我为我的矩阵结构编写了这段代码。它计算一个方形矩阵的值,该矩阵提升到e次幂,但这是无关紧要的。我想知道最后几行发生了什么。
是否将p的值复制到 this 指向的位置?它是浅拷贝还是深拷贝? 此正在更改吗?我不这么认为,因为它是常量。
如何实施该副本以使其运行更快?
matrix& operator ^=(int e)
{
matrix& b = *this;
matrix p = identity(order());
while (e) {
if (e & 1)
p *= b;
e >>= 1;
b *= b;
}
*this = p;
return *this;
}
答案 0 :(得分:1)
如果您为班级添加了适当的缓冲区窃取支持,则以下其中一项会更快:
替换
*this = p;
由(C ++ 11中的首选)
*this = std::move(p);
或(对于C ++ 03,在C ++ 11中仍然可以正常工作)
swap(p); // if swap is a member
swap(*this, p); // if it's not
但是,由于您无法在适当的位置覆盖左侧,因此最好是实施 < / p> <击>
operator^
,并按照以下方式编写operator^=
:
matrix operator^(const matrix& b, int e)
{
matrix p = identity(b.order()); // move or elision activated automatically
while (e) {
if (e & 1)
p *= b;
e >>= 1;
b *= b;
}
return p; // move or NRVO activated automatically
}
matrix& operator^=(int e)
{
*this = (*this) ^ e; // move activated automatically since RHS is temporary
// ((*this) ^ e).swap(*this); in C++03
return *this;
}
击> <击> 撞击>
注意到你正在覆盖*this
到位,连续的正方形。
答案 1 :(得分:0)
*this = p;
调用你的矩阵的operator=(matrix)
方法,如果它有一个,否则它调用编译器生成的operator=()
,简单地执行成员的成员副本p
的{{1}}字段中的this
字段(使用各自的operator=()
实现)。