Vadim Godunko <vgodunko <at> rostel.ru> writes:
64битные значения на x86 можно атомарно гонять с помощью
lock cmpxchg8b. CAS здесь ни к чему, зато он
атомарен и для восьми байт.
Низя, нет такой команды в i386 И не надо указывать на документацию Pentium IV или Core 2, ведь никому не секрет что это не переносимое подмножество x86!
ftp://download.intel.com/design/pentium/manuals/24319101.PDF
Intel Architecture Compatibility
This instruction is not supported on Intel processors earlier than the Pentium processors.
Ну да. Не помешал бы режим с поддержкой более современных процессоров, нежели 486. (Например, обратить внимание на -march)
Инлайнить cmpxchg8b было бы не совсем честно, зато
можно динамически определять архитектуру процессора, и уже
тогда с чистой совестью предоставлять оптимизированное
решение.
Вадим что–то писал насчёт разницы в три раза для Qt
строк в
C++ и в Аде. Не привлекательно.
Писал, было такое. А ещё писал, что есть реализация,
лишенная этого
недостатка. И в ней можно "подглядеть" как счётчик
ссылок делатеся
"красиво".
http://adaforge.qtada.com/cgi-
bin/tracker.fcgi/matreshka/browser/trunk/matreshka/source/league
см. league-strings.ads как стартовую точку.
Зачем так далеко? Разве нельзя было сразу в
matreshka-internals-atomics-counters__gcc.adb
function Sync_Sub_And_Fetch_32
(Ptr : not null access Interfaces.Integer_32;
Value : Interfaces.Integer_32) return Interfaces.Integer_32;
procedure Sync_Sub_And_Fetch_32
(Ptr : not null access Interfaces.Integer_32;
Value : Interfaces.Integer_32);
pragma Import (Intrinsic, Sync_Sub_And_Fetch_32, "__sync_sub_and_fetch_4");
Неудивительно, что здесь всё шито–крыто. Это даже лучше, чем
обычные ассемблерные вставки, потому что реализация зависит от
-march, а также потому, что на Itanium, учитывая VLIW, ассемблерную вставку сделать нетривиально. Интересно, давно это в GNAT
компилируется?
Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти