如果`atomic <t>`是无锁的,并且大小与`T`相同,那么内存布局是否相同?

时间:2019-05-01 22:35:36

标签: c++ c++11 atomic abi memory-layout

This question here表示std::atomic<T>通常 的大小应与T相同,实际上,gcc,clang,在x86,x64和ARM上使用msvc。

std::atomic<T>对于某些类型T总是无锁的实现中,是否保证其内存布局与T的内存布局相同? std::atomic是否还有其他特殊要求,例如对齐?

2 个答案:

答案 0 :(得分:5)

在审查 [atomics.types.generic] 时,您链接的答案部分引用了该注释,关于对齐的唯一说明是您之前看到的注释:

  

注意:原子专业化的表示形式不必与其相应的参数类型相同。专业化代码的大小应尽可能相同,因为这可以减少移植现有代码所需的工作量

在较新的版本中:

  

原子专业化的表示   不需要具有与   其对应的参数类型。

此外,至少有一种体系结构IA64,gives a requirement用于诸如cmpxchg.acq之类的指令的原子行为,这表明面向IA64的编译器可能需要以不同于非原子的方式对齐原子类型。原子类型,即使没有锁也是如此。

此外,使用编译器功能(如压缩结构)将导致原子和非原子变体之间的对齐方式有所不同。考虑以下示例:

#include <atomic>
#include <iostream>
struct __attribute__ ((packed)) atom{
    char a;
    std::atomic_long b;
};
struct __attribute__ ((packed)) nonatom{
    char a;
    long b;
};

atom atom1;
nonatom nonatom1;
int disp_aligns(int num) {
    std::cout<< alignof(atom1.b) << std::endl;
    std::cout<< alignof(nonatom1.b) << std::endl;
}

at least one configuration上,atom1.b的对齐方式将在8字节边界上,而nonatom1.b的对齐方式将在1字节边界上。但是,这是在我们要求打包结构的前提下进行的。目前尚不清楚您是否对此案感兴趣。

答案 1 :(得分:4)

From the standard

  

原子专长的表示形式与其对应的参数类型不必具有相同的大小和对齐要求。

因此,至少到目前为止,答案是否定的,它不能保证大小相同,也没有相同的对齐方式。但是它可能有,除非没有,然后就不会。