我正在为Matrix算术编写一个类,我正在实现的一个功能是你可以“切片”矩阵并返回另一个矩阵,但这样做是为了使返回的矩阵引用父类的内存。如果您想要获取矩阵的子部分或向列添加矢量或类似的事情,这非常有用。
但是,我想实现它,这样如果分配或复制返回的矩阵,则会破坏别名并复制内存,因此您无法轻易地永久传递别名矩阵。
在玩这个时,我有这样的事情:
matrix B = A.slice(1,1);
A.slice(1,1)返回A的子矩阵(偏移1行和1列)。我实现了=运算符来打破别名,但对于我的chagrine,在执行此操作时不会调用它,即使使用-O0也是如此。类似地:
matrix B(A.slice(1,1));
不调用复制构造函数(也写入中断别名)。唯一有效的是:
matrix B; B = A.slice(1,1);
我的问题是,很明显,因为我在前两个示例中直接从A初始化B,它采用某种快捷方式,而我在最后一个示例中首先显式创建B,然后然后赋值A.slice(1,1)到它。
在调用复制构造函数和赋值运算符时,有人可以让我对这些情况下的规则有所了解吗?
答案 0 :(得分:4)
这称为复制省略,或返回值优化(C ++ 11标准的第12.8.31节)。几乎任何返回类类型的函数都可以跳过复制构造函数。这通常与返回类类型的实际实现密切相关。 (请注意,您也有点依赖于此:大概slice
按值返回矩阵类型,如果它会破坏别名,您不需要在那里调用复制构造函数。)
您很可能需要以其他方式实现此功能 - 例如,slice
返回某种支持相同操作的代理类型,并且可以转换为常规矩阵类型,在转换期间打破别名。