gpt4 book ai didi

c++ - std::atomic_uint16_t 或 std::atomic_uint64_t 用于此将溢出的值

转载 作者:行者123 更新时间:2023-11-30 04:47:34 25 4
gpt4 key购买 nike

std::atomic_uint64_t gCounter = 0;

constexpr size_t MaxItems = 4096;
constexpr size_t Mask = MaxItems - 1u;

// Get an index, from 0-4095, in round-robin fashion.
uint16_t GetIndex() {
return gCounter++ & Mask;
}

在查看我编写的这段代码时,我想知道使用 std::atomic_uint16_t 而不是 std::atomic_uint64_t 是否更节省内存/速度对于上面的代码,因为 GetIndex() 返回的值在 [0, 4095] 范围内。如果它不使用原子,我会为 gCounter 使用 uint16_t,但由于这是处理原子,我只是不确定。

最佳答案

变成一个答案,因为它是:

这会因 CPU 而异,但我假设 16 位写入与 64 位写入对于任何 64 位系统都是相同的。老实说,16/64 位非原子在性能方面也可能是相同的(再次假设 64 位 CPU 字。)我实际上发现使用 16 位通常会降低性能,因为它偶尔会增加对和关闭寄存器等的高位。

出于其他原因,该代码让我担心。您正在执行 4 个操作:加载、递增、存储。我不知道有多少系统(老实说)可以原子地完成所有这些,所以这可能成为某种锁定/解锁。这会压倒 16/64 位写入是荒谬的。

我的担心是没有根据的,因为 and 不会存储到内存中,因此不需要锁定或尝试读/写循环。

但仍然:

您可以检查您的程序集输出以确保您得到了您期望的结果。

关于c++ - std::atomic_uint16_t 或 std::atomic_uint64_t 用于此将溢出的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56195158/

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