比如说,如果我想创建一个仅用于保存POD结构和常规数据类型的向量类型。我可以这样做吗?看起来非常不安全,但它确实有效。如果是,可能会出现什么样的问题?
template <size_t N>
struct Bytes {
char data[N];
};
std::vector<Bytes<sizeof(double)> > d_byte_vector;
std::vector<double>* d_vectorP = reinterpret_cast<std::vector<double>*>(&d_byte_vector);
for (int i=0;i<50;i++) {
d_vectorP->push_back(rand()/RAND_MAX);
}
std::cout << d_vectorP->size() << ":" << d_byte_vector.size() << std::endl;
答案 0 :(得分:4)
不,这不安全。特定的编译器可能会对C ++的那种方言有所保证,但是根据标准,你通过实例化一个char
数组并假装它实际上是完全不相关的东西来唤起未定义的行为。
通常当我看到这样的代码时,作者会选择三件事中的一件而错过了正确的方法之一:
void*
(或char*
)实际上指向某些真实数据类型。char
的大缓冲区,然后使用placement-new在其中构建实际对象。答案 1 :(得分:1)
不,这不安全,通常不推荐,因为编译器不需要以允许它的方法运行。话虽如此,我发现了一个原因(最近也是这样),这是我想避免指针的pimpl习语的变体,这样我的所有数据访问都可以避免分配内存的需要for,取消分配内存,并取消引用额外指针。该代码尚未投入生产,我仍然密切关注该部分代码,以确保它不会引发任何其他问题。
除非您生成必须极度优化的代码,否则我建议您找一些其他方法来做您需要做的事情。