【发布时间】:2017-01-15 13:15:54
【问题描述】:
std::array<T,N> v 和 T u[N] 的底层位表示是否相同?
换句话说,将N*sizeof(T) 字节从一个字节复制到另一个字节是否安全? (通过reinterpret_cast 或memcpy。)
编辑:
为了澄清,重点是相同的位表示和reinterpret_cast。
例如,假设我在一些可复制的类型T 上拥有这两个类,对于一些N:
struct VecNew {
std::array<T,N> v;
};
struct VecOld {
T v[N];
};
还有遗留功能
T foo(const VecOld& x);
如果表示相同,那么这个调用是安全的并且避免了复制:
VecNew x;
foo(reinterpret_cast<const VecOld&>(x));
【问题讨论】:
-
您是使用
data/&array_name[0]还是使用“数组”本身的名称进行复制? -
不通过
reinterpret_cast,因为严格的别名。 -
嗯...原来的问题是关于复制的,新的问题是关于
reinterpret_cast-ing。这有点不同...... -
看起来您正试图通过用新结构替换旧结构来现代化遗留 C++ 代码,对吧?
-
然后有人更改
VecNew,例如添加新字段并享受调试。不,谢谢。
标签: c++ c++11 memcpy reinterpret-cast