gpt4 book ai didi

c++ - 实现 C++ 模板列表类的高效初始化

转载 作者:行者123 更新时间:2023-11-28 05:10:58 24 4
gpt4 key购买 nike

为了编写模板列表类,相当于 vector(纯粹作为设计练习),我试图找出如何提高效率。

如果有人写:

v = new T[size];

然后编译器会调用T的构造函数,对吧? T()

所以在下面的类中:

v = (T*) new char[sizeof(T) * size]

这看起来很简单。但是,在析构函数中,如何只删除已经初始化的呢?在下面的类中,只有第一个“使用过”的元素被初始化。

另外,在拷贝构造函数中,如何高效地只对使用过的元素调用T的拷贝构造函数?

如果我以昂贵的方式初始化,它会起作用:

v = new T[size];
for (int i = 0; i < used; i++)
v[i] = orig.v[i];

但这要求 v 已经用 T() 初始化。什么是更好的方法?

类如下:

#include <cstdint>

template<typename T>
class List {
private:
uint32_t used;
uint32_t capacity;
T* v;
public:
List(uint32_t cap) : used(0), capacity(cap), v((T*)new char[sizeof(T)*capacity]) {}
~List() {
delete [] v; // no
}
List(const List& orig) : used(orig.used), capacity(orig.capacity), v((T*) new char[sizeof(T)*capacity]) {
// now copy only the used ones
for (int i = 0; i < used; i++)
v[i] = orig.v[i]; // no, operator = will call destructor on v[i], but it is uninitialized
}
};

最佳答案

要像 std::vector 一样,您需要使用“placement new”并显式调用析构函数。

#include <new>

~List() {
while (used) {
--used;
v[used]->~T();
}
delete[] reinterpret_cast<char*>(v);
}

List(const List& orig) : used(orig.used), capacity(orig.capacity),
v(reinterpret_cast<T*>(new char[sizeof(T)*capacity])) {
// now copy only the used ones
for (int i = 0; i < used; i++)
new(v+i) T(orig.v[i]);
}

注意上面的复制构造函数不是异常安全的。努力做到这一点。

关于c++ - 实现 C++ 模板列表类的高效初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43508233/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com