[英]C++ array member without initialization
我试着编写一个“inline-vector”类来方便地在堆栈中存储大量元素:
template<typename T, size_t size_ = 256>
struct InlineVector{
T content[size_];
size_t num;
T() : num(0) {}
~T() { for(size_t s = 0; s < num; s++){ content[s]->~T(); } }
template<typename _Up, typename... _Args>
void emplace_back(_Args&&... __args) { new (&content[num++]) T(__args); }
T& get(size_t i) { assert(i < num); return content[i]; }
}
出于效率原因,我希望content
不会在X
的构造函数中初始化,即使T
只有一个非平凡的构造函数。 如您所见,稍后实际插入内容时,将使用新的内容初始化内容。 但是,C ++似乎强制要求必须在X
初始化中初始化content
所有元素。 例如,这不编译:
struct Y{ Y(int){} }
X<Y> foo; // compile error, no constructor for Y is called in the construction of X
那么,即使数组元素类型需要构造函数,如何使一个未初始化的数组成员成为可能呢?
通过使该数组成为一个char
数组,然后将其new
放置到其中。 char
是你唯一允许这样做的类型。
当你在它的时候,你也可以编写自己的分配器 (将数组作为其成员之一),然后将其插入到std::vector
而不是重新发明整个shebang。
std::vector<int, YourAllocatorType<int, 256>> v;
那么,即使数组元素类型需要构造函数,如何使一个未初始化的数组成员成为可能呢?
它不是用于T x[n]
...,但是您可以将任何旧的T*
指向正确对齐的未初始化内存,然后管理您自己的临时构造和破坏。 你也可以探索用你的类型创建一个union
并说一个char
,并有一个工会数组....
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.