InterlockedExchange и выравнивание памяти

Общее руководство от Microsoft здесь:

http://msdn.microsoft.com/en-us/library/ms229002.aspx

Автоматические свойства в C # великолепны, и я использую их тогда, когда могу, но есть случаи, когда они не работают для меня, например, при проверке типа или значения в методе set.

В общем: используйте верблюжий корпус и не ставьте свое имя перед префиксом типа подчеркивания или префикса типа.

public int Age {get; set;}

или

private int age;
public int Age
{
    get { return age; }
    set
    {
        if(value < 0)
            throw new InvalidOperationException("Age > 0");
        age = value;
    }
}

8
задан Peter Cordes 27 November 2019 в 07:01
поделиться

3 ответа

Несмотря на то, что префикс блокировки не требует выравнивания памяти, а операция cmpxchg, которая, вероятно, используется для реализации InterlockedExchange (), не требует выравнивания, если ОС включила проверку выравнивания, тогда cmpxchg вызовет исключение проверки выравнивания (AC) при выполнении с невыровненными операндами. Ознакомьтесь с документацией для cmpxchg и т.п., просмотрев список исключений защищенного режима. Я не знаю наверняка, поддерживает ли Windows проверку выравнивания, но меня это не удивит.

1
ответ дан 5 December 2019 в 22:20
поделиться

Я хочу дополнить этот ответ следующим утверждением - я ничего не знаю о Фортране или Matlab

Однако я думаю, что вы почти отвечаете на свой вопрос в своем вопросе.

Зачем вам это? не использовать научный язык для написания ядра. Вы бы использовали наиболее подходящий язык для поставленной задачи. Ядро лучше всего писать на C, так как оно лучше подходит для работы с низкоуровневыми задачами, такими как ядра (работа с управлением памятью и т. Д.)

Ядро не является научным приложением, поэтому вы не будете использовать научный язык.

Опять же, возможно, я совершенно ошибаюсь, но я думаю, что это очень логичный ответ.

оптимизирован за счет возможности блокировки кеша и предотвращения полной блокировки шины к основной памяти). CAN выполняет 8-битные операции с блокировкой.

Я чуть не забыл, из Intel TBB , они определяют загрузку / сохранение 8-битных без использования неявной или явной блокировки (в некоторых случаях );

.code 
    ALIGN 4
    PUBLIC c __TBB_machine_load8
__TBB_machine_Load8:
    ; If location is on stack, compiler may have failed to align it correctly, so we do dynamic check.
    mov ecx,4[esp]
    test ecx,7
    jne load_slow
    ; Load within a cache line
    sub esp,12
    fild qword ptr [ecx]
    fistp qword ptr [esp]
    mov eax,[esp]
    mov edx,4[esp]
    add esp,12
    ret

EXTRN __TBB_machine_store8_slow:PROC
.code 
    ALIGN 4
    PUBLIC c __TBB_machine_store8
__TBB_machine_Store8:
    ; If location is on stack, compiler may have failed to align it correctly, so we do dynamic check.
    mov ecx,4[esp]
    test ecx,7
    jne __TBB_machine_store8_slow ;; tail call to tbb_misc.cpp
    fild qword ptr 8[esp]
    fistp qword ptr [ecx]
    ret
end

В любом случае, надеюсь, что это немного прояснит для вас.

1
ответ дан 5 December 2019 в 22:20
поделиться

Когда-то давно Microsoft поддерживала WindowsNT на процессорах, отличных от x86, таких как MIPS, PowerPC и Alpha. Все эти процессоры требуют согласования для их взаимосвязанных инструкций, поэтому Microsoft поместила требование в свои спецификации, чтобы гарантировать, что эти примитивы будут переносимы на разные архитектуры.

6
ответ дан 5 December 2019 в 22:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: