将char阵列向量施加到POD矢量



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

no,这不是安全的。特定的编译器可能会保证C 方言特别的保证,但是根据您的标准,您通过实例化char数组并假装它实际上是完全无关的东西来引起不确定的行为。

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

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

否,这是不安全的,通常不建议使用,因为不需要编译器以允许它的方法进行操作。话虽如此,我找到了一个恰好这样做的原因(最近也是最近),这是我想避免指针的Pimpl成语的变体因为,将内存分配给并放置额外的指针。该代码尚未在生产中,我仍在关注该代码部分,以确保它不会开始引起任何其他问题。

除非您要生成必须是极其优化的代码,否则我建议您找到其他需要做的任何方法。

最新更新