Я хочу сэкономить память путем преобразования существующего 32-разрядного счетчика в 16-разрядный. Этот счетчик атомарно увеличивается / уменьшается. Если я сделаю это:
Спасибо за ваши комментарии!
Вот тот, который использует расширения сборки GCC, в качестве альтернативы ответу Стива на 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%.
Чтобы ответить на три других вопроса: