gpt4 book ai didi

c++ - 在什么情况下 C++ 会优化构造函数调用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:56:19 25 4
gpt4 key购买 nike

我正在为矩阵算术编写一个类,我正在实现的一个功能是您可以“切片”一个矩阵并取回另一个矩阵,但这样做是为了让返回的矩阵引用父级的内存。如果您想要获取矩阵的一部分或将 vector 添加到列或类似的东西,这将非常有用。

但是,我想实现它,以便在分配或复制返回的矩阵时,别名被破坏并复制内存,这样您就不能轻易地永远传递别名矩阵。

在玩这个的时候,我有这样的东西:

matrix B = A.slice(1,1);  

A.slice(1,1) 返回 A 的子矩阵(偏移 1 行 1 列)。我实现了 = 运算符来打破别名,但令我懊恼的是,在执行此操作时它不会被调用,即使 -O0 打开。同样:

matrix B(A.slice(1,1)); 

不调用复制构造函数(也是为了打破别名而编写的)。唯一有效的是:

matrix B; B = A.slice(1,1);

我的问题是,很明显,因为在前两个示例中我直接从 A 初始化 B,所以它采用了某种快捷方式,而在最后一个示例中我明确地首先创建 B 然后然后分配A.slice(1,1) 到它。

谁能告诉我一些关于在此类情况下调用复制构造函数和赋值运算符时的规则是什么?

最佳答案

这称为复制省略,或返回值优化(C++11 标准的§12.8.31)。几乎任何返回类类型的函数都可以跳过复制构造函数。这通常与返回类类型的实际实现密切相关。 (请注意,您也有点依赖于此:大概 slice 按值返回您的矩阵类型,如果它会破坏您的别名,您不希望在那里调用复制构造函数。)

您很可能需要以其他方式实现它——例如,slice 返回某种支持相同操作并可以转换为普通矩阵类型的代理类型,打破别名在那个转换过程中。

关于c++ - 在什么情况下 C++ 会优化构造函数调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9253316/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com