将char char数组结构向量转换为POD向量?

时间:2014-01-27 20:45:18

标签: c++ vector stl casting

比如说,如果我想创建一个仅用于保存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;

2 个答案:

答案 0 :(得分:4)

不,这不安全。特定的编译器可能会对C ++的那种方言有所保证,但是根据标准,你通过实例化一个char数组并假装它实际上是完全不相关的东西来唤起未定义的行为。

通常当我看到这样的代码时,作者会选择三件事中的一件而错过了正确的方法之一:

  1. 也许作者想要一个抽象数据结构。更好的方法是使用抽象基类,并将实现移到别处。
  2. 也许作者想要一个不透明的数据结构。在这种情况下,我会使用pimpl习语的一些变体,其中呈现给用户的void*(或char*)实际上指向某些真实数据类型。
  3. 也许作者想要某种内存池。实现这一目标的最佳方法是分配char的大缓冲区,然后使用placement-new在其中构建实际对象。

答案 1 :(得分:1)

不,这不安全,通常不推荐,因为编译器不需要以允许它的方法运行。话虽如此,我发现了一个原因(最近也是这样),这是我想避免指针的pimpl习语的变体,这样我的所有数据访问都可以避免分配内存的需要for,取消分配内存,并取消引用额外指针。该代码尚未投入生产,我仍然密切关注该部分代码,以确保它不会引发任何其他问题。

除非您生成必须极度优化的代码,否则我建议您找一些其他方法来做您需要做的事情。