【发布时间】:2018-12-13 05:09:37
【问题描述】:
template<typename T>
struct raster {
std::vector<T> v;
template<typename U, typename = std::enable_if_t<sizeof(T) == sizeof(U)>>
raster(raster<U>&& other){
// What code goes here?
}
}
假设我们有raster<uint32_t> r 使得r.v.size() 有数百万,并保证它的所有元素都在int32_t 的范围内。 raster<int32_t>::raster(raster<uint32_t>&& other) 是否可以避免复制内存支持other.v?
或者我应该只执行*reinterpret_cast<raster<int32_t>*>(&r) 之类的操作而不是调用该构造函数?
【问题讨论】:
-
@FrançoisAndrieux 实际上我想保留每个元素的价值。但是
int32_t和uint32_t对可相互表达的整数有相同的表示吗? (即从 [0 2^31-1]) -
有保证吗? [2^31, 2^32-1] 范围内什么都没有?
-
@JHBonarius 期望的行为是让被盗的内存按原样重新解释。
-
如果要窃取的对象的
size()(而不是capacity())为零,那么关于类型的讨论是否重要?在这种情况下,甚至sizeof类型都不重要(但对齐确实如此):在这种情况下,所有vector<T>持有的是原始内存。但是没有合法的途径获得它。 -
@C.M.除非
T和U是同一类型,否则您不能reinterpret_cast一个std::vector<T>指针或引用另一个std::vector<U>指针或引用。取消引用结果指针始终是未定义的行为。
标签: c++ c++14 stdvector move-semantics reinterpret-cast