gpt4 book ai didi

c++ - 避免 C++ vector 复制

转载 作者:行者123 更新时间:2023-11-28 04:06:34 25 4
gpt4 key购买 nike

我想避免复制一个非常大的 vector 。这是问题所在的一个非常清楚的示例:

struct MyStruct {
std::vector<int> v;
int x;
}

class MyClass {
MyStruct lastStruct_;
public:
MyStruct create_struct() {
MyStruct s = { std::vector<int>(1000000, 1), 1234 };
lastStruct_ = s; // THIS IS A FULL COPY, PROBLEM
return s; // THIS SHOULD NOT BE A COPY AS PER C++11 AND UP
}
MyStruct getLastStruct() {
return lastStruct_;
}
}

void main()
{
MyClass c;
for (int i = 0; i < A_LOT; i++)
{
writeToDisk(c.create_struct());
}
//MEANWHILE IN OTHER THREAD:
// while(true)
// updateUI(c.getLastStruct());
}

如何避免在此处复制?我正在尝试用共享指针解决这个问题,但我对这些还是陌生的。这样的事情会起作用吗(语法可能会关闭)?

struct MyStruct {
std::vector<int> v;
int x;
}

class MyClass {
std::shared_ptr<MyStruct> lastStruct_;
public:
MyStruct create_struct() {
auto s = std::maked_shared<MyStruct>({ std::vector<int>(1000000, 1), 1234 });
lastStruct_ = s;
return *s;
}
std::shared_prt<MyStruct> getLastStruct() {
return lastStruct_;
}
}

void main()
{
MyClass c;
for (int i = 0; i < A_LOT; i++)
{
writeToDisk(c.create_struct());
}
//MEANWHILE IN OTHER THREAD:
// while(true)
// updateUI(c.getLastStruct()->data());
}

最佳答案

这是最明显的方法:

struct MyStruct {
std::vector<int> v;
int x;
}

class MyClass {
std::shared_ptr<MyStruct> lastStruct_;
public:
std::shared_ptr<const MyStruct> create_struct() {
auto s = std::maked_shared<MyStruct>({ std::vector<int>(1000000, 1), 1234 });
// acquire lock
lastStruct_ = s;
// release lock
return s;
}
std::shared_ptr<const MyStruct> getLastStruct() {
// acquire lock
auto j = lastStruct_;
// release lock
return j;
}
}

void main()
{
MyClass c;
for (int i = 0; i < A_LOT; i++)
{
auto j = c.create_struct();
writeToDisk(*j);
}
//MEANWHILE IN OTHER THREAD:
// while(true)
// {
// auto j = c.getLastStruct();
// updateUI(j->data());
// }
}

请注意,我们通过用指向新对象的共享指针替换指向旧对象的共享指针来替换对象。访问旧对象的代码会使其保持事件状态,直到完成处理为止。

您需要某种锁来保护 lastStruct_ 在一个线程中被另一个线程访问时不被修改。

关于c++ - 避免 C++ vector 复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58617719/

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