说,如果我想创建仅用于保存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
数组并假装它实际上是完全无关的东西来引起不确定的行为。
通常,当我看到这样的代码时,作者要做三件事之一,错过了正确的方法之一:
- 也许作者想要抽象数据结构。更好的方法是使用抽象基类,并将实现移动到其他地方。
- 也许作者想要不透明的数据结构。在这种情况下,我将采用PIMPL成语的某些变体,其中呈现给用户的
void*
(或char*
)实际上指向某些真实的数据类型。 - 也许作者想要某种内存池。实现这一目标的最佳方法是分配
char
的大型缓冲区,然后使用安置新的new在其中构造真实对象。
否,这是不安全的,通常不建议使用,因为不需要编译器以允许它的方法进行操作。话虽如此,我找到了一个恰好这样做的原因(最近也是最近),这是我想避免指针的Pimpl成语的变体因为,将内存分配给并放置额外的指针。该代码尚未在生产中,我仍在关注该代码部分,以确保它不会开始引起任何其他问题。
除非您要生成必须是极其优化的代码,否则我建议您找到其他需要做的任何方法。