基于函数返回的stl容器的构造效率
Efficiency of construction of stl container based on a function return
我有一个返回stl容器的工厂函数:
const std::vector<int> f(...) {
std::vector<int> retval;
return retval;
}
我想这是ok的定义一个stl实例如下(没有错误):
const std::vector<int> stl_instance(f(...));
但是这样做有效率吗?
临时stl对象是否直接赋值给stl_instance
?
返回const右值是c++ 11中的反模式。首先考虑返回非const右值:
std::vector<int> f(int n)
{
return std::vector<int>(n);
}
int main()
{
std::vector<int> v;
v = f(3);
}
在c++ 98/03中,这段代码将至少两次进入堆:
- 在f内部创建向量(如果RVO适用)
- 将f的返回值赋值给v
如果你的编译器不应用RVO,你会得到3个堆分配。
在c++ 11中,你只得到一个堆分配:在f
中创建向量。这与RVO无关。原因是所有STL容器都有带有
vector( vector&& other );
vector& operator=( vector&& other );
右值引用&&
将把资源从你的创建函数内部直接移动到它们的目的地。但是,您的代码具有签名
const std::vector<int> f(int n)
{
return std::vector<int>(n);
}
将禁用move语义,因为T&&(即移动构造函数和赋值操作符的参数)不会绑定到const右值形参(即函数的返回值)。这有效地使您的代码运行在c++ 98/03下(即2或3堆分配)。
这是良好的和合法的代码。
编译器将通过拷贝省略处理必要的优化(如果可以的话)。
保证临时f(...)
至少在表达式结束之前有效。注意,表达式结束于stl_instance(f(...))
的返回值之后,确切地说是;
( call结尾的分号)。所以它是完全有效的。
c++ 03 Standard§12.2/3:
临时对象在(词法上)包含创建它们的点的完整表达式(1.9)求值的最后一步被销毁。
相关文章:
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 在C应用程序中运行C++(带有STL)函数
- 使用2个键的cpp-stl::优先级队列排序不正确
- 在STL容器中使用模板类
- 为什么当我解模块化时,这个C++代代码"效率较低"?
- 用C++中的CPerson(类)类型的对象初始化STL矢量
- 将stl字符串缩小到小于15个字符的容量
- 在为LINUX创建共享库时,如何避免STL的私有/弱副本
- 检查函数返回类型是否与STL容器类型值相同
- STL算法函数在多个一维容器上的使用
- STL/标准C++容器的最佳效率如何
- stl数据结构的堆栈上输出参数与返回值的效率
- 迭代器和const_iterator的效率不同(STL)
- 每个C++STL收集操作的算法效率
- 使用大对象时的STL效率
- STL矢量元素去除效率
- 固定大小数组的STL算法效率
- 基于函数返回的stl容器的构造效率
- STL 映射插入效率:[] 与插入