std::atomic 店铺后的地址
std::atomic address after store
我似乎无法在存储后获取原子对象的地址。
例如
std::atomic<int> i;
std::atomic<int>* p = &++i; // doesn't work
auto* p = &++i; // doesn't work
// below works:
++i;
auto* p = &i;
这里发生了什么,为什么?
澄清一下:我知道它 return 是一个 r 值。为什么它 return 不是原始对象 this
?这是有目的的设计选择还是疏忽?
更具体地说,此要求的幕后情况是什么?
虽然 pre-increment 运算符 通常 return 通过引用作为其操作数,但在 std::atomic
整数的情况下,它 returns 作为临时值的新值。因此,在您的示例中,++i
不是 return 对 atomic<int> i
本身的引用,它 return 是 i
的新值(即 int)。您可以在以下网址看到:https://en.cppreference.com/w/cpp/atomic/atomic/operator_arith
return 对原始 atomic<int>
的引用会产生误导甚至危险,因为要通过此引用访问 int 值需要 秒,单独读取operation — 因此它的值可能与增量时的值不同。 (这与您的示例代码不是特别相关,因为您只是试图获取指向引用对象的指针,但某些代码实际上会访问 ++
之后的值,所以这就是为什么 returning a无法引用。)
换句话说,如果 ++i
return 引用了 atomic<int> i
,那么
int j = ++i;
相当于
++i;
// ...other threads may modify the value of `i` here!...
int j = i;
原子的全部意义在于将读取和写入作为不可分割的操作一起执行,因此 ++i
必须在内部使用 hardware/OS 原子操作来同时读取和递增整数,因此新值被 return 编辑为临时文件。
如果您想知道引擎盖下是什么,here is libc++'s implementation 在那里您可以看到 operator++
只是调用 fetch_add(1)
和 return 结果 + 1.
我似乎无法在存储后获取原子对象的地址。
例如
std::atomic<int> i;
std::atomic<int>* p = &++i; // doesn't work
auto* p = &++i; // doesn't work
// below works:
++i;
auto* p = &i;
这里发生了什么,为什么?
澄清一下:我知道它 return 是一个 r 值。为什么它 return 不是原始对象 this
?这是有目的的设计选择还是疏忽?
更具体地说,此要求的幕后情况是什么?
虽然 pre-increment 运算符 通常 return 通过引用作为其操作数,但在 std::atomic
整数的情况下,它 returns 作为临时值的新值。因此,在您的示例中,++i
不是 return 对 atomic<int> i
本身的引用,它 return 是 i
的新值(即 int)。您可以在以下网址看到:https://en.cppreference.com/w/cpp/atomic/atomic/operator_arith
return 对原始 atomic<int>
的引用会产生误导甚至危险,因为要通过此引用访问 int 值需要 秒,单独读取operation — 因此它的值可能与增量时的值不同。 (这与您的示例代码不是特别相关,因为您只是试图获取指向引用对象的指针,但某些代码实际上会访问 ++
之后的值,所以这就是为什么 returning a无法引用。)
换句话说,如果 ++i
return 引用了 atomic<int> i
,那么
int j = ++i;
相当于
++i;
// ...other threads may modify the value of `i` here!...
int j = i;
原子的全部意义在于将读取和写入作为不可分割的操作一起执行,因此 ++i
必须在内部使用 hardware/OS 原子操作来同时读取和递增整数,因此新值被 return 编辑为临时文件。
如果您想知道引擎盖下是什么,here is libc++'s implementation 在那里您可以看到 operator++
只是调用 fetch_add(1)
和 return 结果 + 1.