移动语义在哪里是有益的好例子
Good example of where move semantics would be beneficial
EDIT:我希望下面的代码速度慢(并进行过多的复制),这样我就可以使用移动语义重写它,并比较这两种方法
我在一个类中有以下代码:
std::list<boost::shared_ptr<I> > getX(){
std::list<boost::shared_ptr<I> > a;
for(auto kv : b) {
if(something){
a.push_back(kv.second);
}
}
return a;
}
double foo(){
std::list<boost::shared_ptr<I> > a = getX();
现在我在return a
上设置了一个断点,我希望看到列表的某种副本(std::list
复制构造函数,然后是每个I
对象复制构造函数
LEAF_ENTRY __security_check_cookie, _TEXT
cmp rcx, __security_cookie ; check cookie value in frame
jne ReportFailure ; if ne, cookie check failure
rol rcx, 16 ; make sure high word is zero
test cx, -1
jne RestoreRcx
db 0f3h ; (encode REP for REP RET)
ret ; no overrun, use REP RET to avoid AMD
; branch prediction flaw after Jcc
我看不到正在制作的名单的任何副本。我希望看到列表被复制,然后每个I对象都被复制。
(我之所以这么问,是因为我正在尝试编写一些代码,这些代码对于使用移动语义加速非常有用)。
此代码是否通过返回值优化进行了优化?如果是这样的话,我有没有办法修改代码来防止RVO的应用?
一个选项可以是:
std::list<boost::shared_ptr<I> > getX(){
using list = std::list<boost::shared_ptr<I> >;
list empty;
list a;
for(auto kv : b) {
if(something){
a.push_back(kv.second);
}
}
return list( a.empty() ? empty : a );
}
这应该会破坏RVO/NRVO,并强制编译器复制返回的列表。
如果你只想演示移动语义提供的加速,你可以使用这样一种情况,即你实际上不必为了它的有用而与编译器斗争,比如在其范围内移动自动作用域集合时,比如:
typedef vector<float> Grades;
unordered_map<int, string> idsToNames;
unordered_map<int, Grades> idsToGrades;
//ids and names being used seperatly
...
//it would now be more useful to merge them
struct StudentInfo {
string mName; Grades mGrades;
StudentInfo(string && name, Grades && grades):mName(name),mGrades(grades){}
};
unordered_map<int, StudentInfo> idsToStudentInfo;
for(pair<int, string>& s : idsToNames) {
idsToStudentInfo.insert(
make_pair(s.first,
StudentInfo(std::move(s.second),std::move(idsToGrades[s.first]))
)
);
}
因此,在这里,它们不是复制Grades向量和字符串(char向量),而是在mName字符串和mGrades字符串的move构造函数中交换,速度更快。
相关文章:
- C++我需要了解在哪里使用指针和双指针
- 未定义的引用在哪里
- 谷歌测试中的期望值存储在哪里
- 尽管遵循了规则,内存泄漏在哪里
- 静态数据成员模板专用化的实例化点在哪里
- 在哪里放置我的函数?进入我的母语 Gui 还是进入我的演示者?
- 在哪里声明结构运算符重载
- C++ 中的自定义异常:在哪里定义它们?
- 常量参数存储在哪里 (C++)?
- 如何在 c++ 中确定一条指令(以字节为单位)在哪里结束,另一条指令从哪里开始?
- 此递归函数的每次迭代的值存储在哪里?
- 如何告诉本机节点模块所需的dll存储在哪里?
- 在哪里存储跨平台C++应用存储?
- C++泛型类错误,问题出在哪里?
- 在标准中,模板参数的语法在哪里定义,例如,'std::function<int(char)>'?
- 将类作为主要参数的语法在哪里需要?
- 模板参数在 C++ 中存储在哪里?
- 移动语义在这里如何工作?
- 我的重复检查代码中的错误究竟在哪里?
- 移动语义在哪里是有益的好例子