我想通过将现有的 32 位计数器转换为 16 位计数器来节省内存。这个计数器是原子递增/递减的。如果我这样做:
- 我对 x86/x86_64 上的 atomic_inc(uint16_t x) 使用什么指令?
- 这在多处理器 x86/x86_64 机器中是否可靠?
- 这样做是否会对这些架构中的任何一个造成性能损失?
- 如果 (3) 是,那么预期的性能损失是多少?
感谢您的意见!
我想通过将现有的 32 位计数器转换为 16 位计数器来节省内存。这个计数器是原子递增/递减的。如果我这样做:
感谢您的意见!
这是使用 GCC 程序集扩展的一个,作为 Steve 的 Delphi 答案的替代方案:
uint16_t atomic_inc(uint16_t volatile* ptr)
{
uint16_t value(1);
__asm__("lock xadd %w0, %w1" : "+r" (value) : "m" (*ptr));
return ++value;
}
将 1 更改为 -1,将 , 更改++
为--
递减。
这是一个有效的Delphi函数:
function LockedInc( var Target :WORD ) :WORD;
asm
mov ecx, eax
mov ax, 1
Lock xadd [ecx], ax
Inc eax
end;
我想您可以将其转换为您需要的任何语言。
执行原子增加的最简单方法如下(这是内联 ASM):
asm
lock inc dword ptr Counter;
end;
其中 J 是一个整数。这将直接增加其内存位置的计数器。
我已经用蛮力测试了它,它可以 100% 工作。
回答其他三个问题: