如果`原子 `是无锁且与`T`大小相同,内存布局是否相同?

问题描述 投票:2回答:2

This question here表示std::atomic<T>通常应该与T具有相同的大小,事实上在x86,x64和ARM上似乎就是gcc,clang和msvc的情况。

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

c++ c++11 atomic
2个回答
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字节边界上。然而,这是假设我们要求结构包装;目前尚不清楚您是否对此案感兴趣。


4
投票

From the standard

原子特化的表示不需要与其对应的参数类型具有相同的大小和对齐要求。

所以答案,至少就目前而言,不是,它不能保证大小相同,也不能保持一致。但它可能有,除非它没有,然后它不会。

© www.soinside.com 2019 - 2024. All rights reserved.