给定以下代码:
typename std::aligned_storage<sizeof(T), alignof(T)>::type storage_t;
//this moves the back of src to the back of dst:
void push_popped(std::list<storage_t> & dstLst, std::list<storage_t> & srcLst)
{
auto & src = srcLst.back();
dstLst.push_back(storage_t());
auto & dst = dstLst.back();
std::memcpy(&dst, &src, sizeof(T));
srcLst.pop_back();
}
我知道为什么这种方法通常不正确的 3 个原因(即使它避免了调用,因此避免了's 资源的src->~T()
双重回收)。T
U*
指向U
同一对象的其他成员的类型的对象成员- 隐藏的类成员可能需要更新(例如,vtable)
- 系统需要
T
记录在src
T
dst
(这里提到了这些:http ://www.gamedev.net/topic/655730-c-stdmove-vs-stdmemcpy/#entry5148523 。)
假设这T
不是一个内存地址是其状态属性的类型(std::mutex
或者std::condition_variable
,例如),这些是这种方法的唯一问题吗?或者还有其他可能出错的地方吗?我想要对未知问题的描述。
我想我已经开发了一个“对象重定位语义”,但如果其中有一个明显的漏洞,我不想让人们考虑它。