标准化的方式打包多个值到一个原子

问题描述:

假设我有类型INT32两个原子变量,我可以代替选择代表他们作为std::atomic<int64> both并保留前32位为我的第一个和最后对我的第二个INT。标准化的方式打包多个值到一个原子

这似乎是在x64架构相当空间&节省时间,更何况它能够支持各种各样的妖术,因为人们可以通过各种操作的抽象,让他们原子:

first == a && second ==b 

变得

both == (int64(a) + int64(b) << 32) 
//Or some such... I'm not 100% sure this is correct but you get the idea 

我看到的这个技巧的一个问题是,在位级操作时我并没有特别的发现,而且在位级操作时C++并不是非常友好,尤其是一旦你尝试完成更多c复杂的操作或打包两个以上的变量(例如两个数字和几个布尔)到相同的原子。

所以我不知道是否有适用这种伎俩的标准方法。一种模式甚至是标准功能,当其他编码人员可以很容易地识别并且更容易与实施者一起工作时?同样,这种模式是否足够有用以保证这样的标准化,或者当它与可能带来的可能的烦恼和UB相比时,它的有用性很快就会过时了?

+0

你在找位域? – dasblinkenlight

+0

整数的目的是什么?他们可以存储在'std :: pair'或'std :: tupple'吗?结构?一类? –

+4

哦,也是最重要的选择:*不要做任何事情*尽管它可能会节省几个字节,但将“两个”整数处理成单个变量意味着内存中的节省将被更多需要使用这些值来运作,导致更糟糕的表现。更不用说代码将更难阅读,理解和最重要的维护。包装价值对我来说似乎是一个过早的优化,而那些几乎总是不好的。 –

的方式来解决阅读,然后,写与原子公司正在使用一个循环:

void setBit(atomic<int64_t>& bitset, int bit) 
{ 
    int64_t val = 1LL << bit; 
    int64_t prev = bitset; 
    while ((!(bitset & val)) && 
     !bitset.compare_exchange_weak(prev, (prev | val)) 
    ; 
} 

您可以扩展这种方法来创建通用的位运算功能

+0

这并不是我所追求的,尽管也许这个问题措辞不佳。我正在寻找的更类似于@Bo Persson的答案,这些方法使用这些值进行操作,而无需对比特进行直接操作,也无需执行额外的操作(无论如何将会破坏此优化的整个点)。 – George