我有一个struct包含int m_ref表示内部引用计数的整数(比如说).
为了保持C兼容性,我无法将类型更改为std::atomic<int>:struct可能只包含普通旧数据.
但是,我想调整我的代码以利用C++ 11中的原子功能; 即我需要完成:
++m_ref;
Run Code Online (Sandbox Code Playgroud)
和
--m_ref;
Run Code Online (Sandbox Code Playgroud)
作为原子操作.我目前正在使用汇编程序(英特尔总线锁)来执行此操作,但该代码几乎不可移植,而且我很想在C++提供标准构造时删除它.
不知何故,我需要进入'引擎盖'并做什么atomic<T>但没有创建原子类型的开销:我担心附加m_ref atomic<T>会降低性能.
我怀疑这是非常标准的,我在这里缺少一些简单的东西.
您不能在C++ 11中对非原子类型使用原子操作.您必须使用std::atomic<int>或std::atomic_int对整数进行原子操作.铸造int到std::atomic<int>是未定义的行为.
如果您有C11编译器以及C++ 11编译器,那么您可以atomic_int在两种情况下使用(使用适当using的C++声明).如果编译器兼容,那么一切都将"正常工作".
小智 5
从 C++20 开始使用atomic_ref,你可以这样做:
#include <atomic>
void add(int& a)
{
std::atomic_ref(a).fetch_add(1);
}
Run Code Online (Sandbox Code Playgroud)