gpt4 book ai didi

c++ - 带填充的原子变量(编译器错误?)

转载 作者:太空狗 更新时间:2023-10-29 20:20:42 25 4
gpt4 key购买 nike

<分区>

我在带有 -std=c++14 的 Apple LLVM 版本 9.0.0 (clang-900.0.39.2) 上发现了这种奇怪的行为。以下代码对此进行了演示:

#include <cstdint>
#include <atomic>
#include <iostream>

struct stru {
std::uint32_t a;
std::uint64_t b;
};

int main() {
stru sa{}, sb{1, 1};
std::atomic<stru> atom(sa);
std::cout << atom.compare_exchange_strong(sa, sb) << std::endl;
}

输出是 0,而我希望它是 1。当我将 stru 更改为:

时问题就消失了
struct stru {
std::uint64_t a; // original: std::uint32_t a;
std::uint64_t b;
};

我能看到的唯一区别是原始版本有填充,而修改后的版本没有。看起来 padding 中有垃圾值,它参与了 compare_exchange_strong 计算,并导致意外结果。我想知道标准对此有何看法。这是编译器错误吗?

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com