Код: Выделить всё
volatile struct {
uintptr_t last_read = 0;
uintptr_t last_write = 0;
size_t reads = 0;
size_t writes = 0;
} dbg_data = {};
uint64_t register_read(uintptr_t address) {
dbg_data.last_read = address;
dbg_data.reads++;
return *static_cast(address);
}
void register_write(uintptr_t address, uint64_t value) {
dbg_data.last_write = address;
dbg_data.writes++;
*static_cast(address) = value;
}
< /code>
Они никогда не читаются из кода, только отладчиком, чтобы быстро увидеть состояние программы. Несмотря на то, что программа многопоточная, было решено не синхронизировать доступ к этим глобальным переменным, чтобы избежать достижения производительности. Даже атомика нежелательна, поскольку они постоянно вызывают недействительную кеша. В худшем случае условие гонки приведет к пропущению некоторых значений, что приемлемо. Волшебное мышление о летучих Подробнее здесь: https://stackoverflow.com/questions/796 ... -from-them