如何确保取消引用仅发生一次

时间:2019-05-29 22:51:51

标签: c++ pointers c++17 volatile dereference

是否有办法确保取消引用仅发生一次,并且来自取消引用的值只能从中加载/存储到一次?例如

class X {
public:
  std::pair<int, int> p;
};

void bar(std::pair<int, int>);

void foo(X* pointer) {
  auto pr = pointer->p;
  bar(pr);
}

int main() {
  auto&& go = std::atomic<bool>{false};
  auto&& x = X{};
  auto&& thread = std::thread{[&]() {
    while (!go.load(std::memory_order_acquire)) {}
    foo(&x);
  }};

  x = create();
  go.store(true, std::memory_order_release);
  thread.join();
}

对于编译器从指针加载多次是有效的,是否有办法确保加载仅发生一次?如果我在foo()中添加volatile,则无法将取消引用的货币对传递给bar(),因为我会将volatile-ness从p中删除。


在其中有用的一个示例是,如果您有一台已连接以从该设备的端口之一接收IO的设备。那么重要的是,您只能从指针读取一次。每次读取对设备意味着某种意义。此外,如果您还有其他不处理易失性类型的代码,则取消引用指针并将非易失性对象传递给外部代码将很重要。

1 个答案:

答案 0 :(得分:-1)

也许您可以在foo函数之外再复制所需的内容,然后将该副本变量传递给函数。