【问题标题】:Exchange pointers in separate function在单独的函数中交换指针
【发布时间】:2017-01-29 10:43:33
【问题描述】:

我有数据,被限制在一个名为transfer_datastruct 中:

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 *&amp;a, int *&amp;b)
  • @songyuanyao:这是我第一次看到这样的东西(*&amp; 的组合)。那只会复制指针,而不是指针指向的全部内容?
  • 或者通过使用**(指向指针的指针),传递给函数。
  • 对了,有一个std::swap,现在用不着那个tmp中介了。
  • @arc_lupus 不,它不会复制指针。准确地说,它也不会复制指针,因为它是引用。反正原理和int&amp;一样。

标签: c++ pointers


【解决方案1】:

通过使用引用,您可以做到这一点。

void switch(transfer_data* &a, transfer_data* &b)

现在可以在函数内部更改作为参数传递的变量。当你在做的时候

void switch(transfer_data* a, transfer_data* b)

制作了存储地址的变量副本,因此原始变量不受影响。引用基本上是某个变量的别名(昵称),因此通过使用引用,您可以在函数体中修改它。

如果您想了解编译器如何实际实现引用,这里有一个很好的starting point

【讨论】:

    猜你喜欢
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    相关资源
    最近更新 更多