繁体   English   中英

没有初始化的C ++数组成员

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM