【发布时间】:2017-01-29 10:43:33
【问题描述】:
我有数据,被限制在一个名为transfer_data 的struct 中:
struct transfer_data{
std::vector<int> data;
}
我有指向该数据的向量:
transfer_data dat1, dat2;
transfer_data *ptr_dat1 = &dat1, *ptr_dat2 = &dat2;
现在我的函数被固定为总是从一个指针的副本中读取数据,而属于另一个指针的数据在第二个线程中处理。当数据处理完成时,第二个线程将第一个指针与第二个指针交换。
我想使用这种方法,以免在第二个线程完成处理时复制太多数据(>1 MB),并避免竞争条件(第一个线程正在读取,第二个线程正在同一个地方写入等等。)。因此,通过仅复制向量应该更快。
我的问题是:如何在函数中交换非全局指针?如果我想对变量这样做,我会写
void switch(int &a, int &b)
{
int tmp = a;
a = b;
b = tmp;
}
在为指针写类似的东西时:
void switch(int *a, int *b)
{
int *tmp = a;
a = b;
b = tmp;
}
但是如果我这样做,那么我只在本地切换指针值,而不是全局切换,即从函数返回意味着返回现状。
如何修复我的功能?还是我的方法存在更根本的缺陷?
【问题讨论】:
-
让它通过引用传递,就像您为
int所做的那样。void switch(int *&a, int *&b) -
@songyuanyao:这是我第一次看到这样的东西(
*和&的组合)。那只会复制指针,而不是指针指向的全部内容? -
或者通过使用**(指向指针的指针),传递给函数。
-
对了,有一个
std::swap,现在用不着那个tmp中介了。 -
@arc_lupus 不,它不会复制指针。准确地说,它也不会复制指针,因为它是引用。反正原理和
int&一样。