C++ 原子变量向量(数组)
我知道atomic有一个被删除的复制构造函数,但是我该怎么做才能使这段代码正常工作呢?如何在原子的向量中定义复制构造函数C++ 原子变量向量(数组),c++,arrays,vector,atomic,copy-constructor,C++,Arrays,Vector,Atomic,Copy Constructor,我知道atomic有一个被删除的复制构造函数,但是我该怎么做才能使这段代码正常工作呢?如何在原子的向量中定义复制构造函数 #include <atomic> #include <vector> int main() { std::vector<std::atomic<int>> examp; examp.resize(64); } std::atomic不可复制或移动。正如您所注意到的,复制构造函数将被删除,但不会生成移动构造函
#include <atomic>
#include <vector>
int main() {
std::vector<std::atomic<int>> examp;
examp.resize(64);
}
std::atomic不可复制或移动。正如您所注意到的,复制构造函数将被删除,但不会生成移动构造函数。见:
如果没有为类类型提供用户定义的移动构造函数
结构、类或联合,并且以下所有条件均为真:
没有用户声明的副本构造函数;
“用户声明”表示编译器未添加,即默认情况下。即使它是一个库类,构造函数也是由用户声明的
向量的resize函数要求类型可以是move-insertable,也可以是copy-insertable,具体取决于重载。见:
如果当前大小小于计数
附加1个附加的默认插入元素
附加2份附加值
你所做的根本不起作用。std::atomic不可复制或移动。正如您所注意到的,复制构造函数将被删除,但不会生成移动构造函数。见:
如果没有为类类型提供用户定义的移动构造函数
结构、类或联合,并且以下所有条件均为真:
没有用户声明的副本构造函数;
“用户声明”表示编译器未添加,即默认情况下。即使它是一个库类,构造函数也是由用户声明的
向量的resize函数要求类型可以是move-insertable,也可以是copy-insertable,具体取决于重载。见:
如果当前大小小于计数
附加1个附加的默认插入元素
附加2份附加值
你所做的根本不起作用。你不能有一个std::atomic的向量,因为它不可复制或移动,但你可以有一个到atomic的唯一ptr的向量。如果您确实需要原子的运行时可变大小向量,这可能是一个可行的替代方案。以下是一个例子:
#include <iostream>
#include <atomic>
#include <vector>
#include <memory>
using namespace std;
int main() {
std::vector<std::unique_ptr<std::atomic<int>>> examp;
examp.resize(64); // 64 default unique_ptrs; they point to nothing
// init the vector with unique_ptrs that actually point to atomics
for (auto& p : examp) {
p = std::make_unique<std::atomic<int>>(0); // init atomic ints to 0
}
// use it
*examp[3] = 5;
for (auto& p : examp) {
cout << *p << ' ';
}
cout << '\n';
}
您不能拥有std::atomic的向量,因为它不可复制或移动,但您可以拥有指向atomic的唯一ptr的向量。如果您确实需要原子的运行时可变大小向量,这可能是一个可行的替代方案。以下是一个例子:
#include <iostream>
#include <atomic>
#include <vector>
#include <memory>
using namespace std;
int main() {
std::vector<std::unique_ptr<std::atomic<int>>> examp;
examp.resize(64); // 64 default unique_ptrs; they point to nothing
// init the vector with unique_ptrs that actually point to atomics
for (auto& p : examp) {
p = std::make_unique<std::atomic<int>>(0); // init atomic ints to 0
}
// use it
*examp[3] = 5;
for (auto& p : examp) {
cout << *p << ' ';
}
cout << '\n';
}
我不知道。如果你不打算复制/移动原子,你可能会有一个常量数组。std::atomic examp[64]可以,但我确实计划最终改变大小。你打算拥有原子的运行时或编译时大小吗?如果大小在compile-time.runtime已知,编译器可以推断大小。取决于用户交互,它将在32到64之间。当然,您可以选择您计划支持的最大可能大小,这不像64整数是系统资源的巨大消耗。我不知道。如果你不打算复制/移动原子,你可能会有一个常量数组。std::atomic examp[64]可以,但我确实计划最终改变大小。你打算拥有原子的运行时或编译时大小吗?如果大小在compile-time.runtime已知,编译器可以推断大小。取决于用户交互,它将在32和64之间。当然,您可以选择您计划支持的最大可能大小,这不像64整数是系统资源的一大消耗。