[问题] 有写法可以确定不会被RVO介入吗?

楼主: dreamboat66 (小嫩)   2016-05-28 08:02:41
http://ideone.com/V97HkZ
一开始在测试std::async的时候无意间发现
如果没有接return value跟有接return value的话
行为有差异
有接: 不会block在那行直接往下走(async)
没接: 就直接卡在那直到thread做完
以上结论让我想了一下, 姑且不知道它内部怎么实做
但 为什么它有能力可以判断 有接 or 没接
我自己的想法是 如果有接, 也许它会走future的move cstr(or move =)
可能可以在解构的时候判断是否被move过
move的话就 detach, 没move的话就就join...
但这件事如果RVO的话 根本不保証它会有move产生...
所以问题就是
1. 有没写法一定可以让RVO无效
2. 有没有好的写法可以判断 有接跟没接这两种case?
3. 我看了一下vc跟g++的 future dstr都是空的没做事...表示我一开始的想法都是错的
到底它怎么做到这行为的呢?
谢谢
作者: Caesar08 (Caesar)   2016-05-28 09:33:00
你错了会不会卡住,的确跟有没有接住async的return value有关但是判断的方法跟move完全没关系他们都是在future的destructor里面判断的vc++ future的destructor的确是空的,但你有看过他继承的class了吗(_State_manager)?另外,根据标准,从C++14之后,只有async产生的future,会在destructor block(假设还没ready)而且该future必须独自拥有这个shared state
楼主: dreamboat66 (小嫩)   2016-05-28 11:06:00
了解,但光靠解构子 怎么能知道有没有被变量接呀?

Links booklink

Contact Us: admin [ a t ] ucptt.com