【发布时间】:2012-05-04 13:33:27
【问题描述】:
如果我使用 auto_ptr 作为填充大型向量的函数的返回值,这会使该函数成为源函数(它将创建一个内部 auto_ptr 并在返回非 const auto_ptr 时传递所有权)。但是,我不能将此函数与 STL 算法一起使用,因为为了访问数据,我需要取消对 auto_ptr 的引用。我猜一个很好的例子是一个大小为 N 的向量字段,每个向量有 100 个分量。如果 N 很大,该函数是否按值或按 ref 返回每个 100 个分量向量是不一样的。
另外,当我尝试这个非常基本的代码时:
class t
{
public:
t() { std::cout << "ctor" << std::endl; }
~t() { std::cout << "dtor" << std::endl; }
};
t valueFun()
{
return t();
}
std::auto_ptr<t> autoFun()
{
return std::auto_ptr(new t());
}
autoFun 和 fun 调用都会产生输出
导演 管理员
所以我实际上看不到正在创建以传递给 return 语句的自动变量。这是否意味着为 valueFun 调用设置了返回值优化?在这种情况下 valueFun 是否会创建两个自动对象?
然后,我如何使用函数优化大量如此庞大的数据结构?
【问题讨论】:
-
您是否在问 RVO 是否也适用于您的大型向量?如果是这样,你不能用上面的例子来测试它吗?
-
当我测试它时,这是否意味着它适用于所有编译器/平台?我怎么知道 RVO 是否包含在内,我应该阅读编译器规范吗?如果代码在使用不同编译器的 HPC 集群上编译,并且库很大,会发生什么情况?
-
是的,我明白你的意思。这是编译器允许但不需要做的事情之一,所以你永远无法确定。顺便说一句,你有 C++11 支持吗?