Я работаю над многоплатформенной библиотекой с несколькими компиляторами. Библиотека имеет следующий макрос:Является ли барьер памяти ручным оптимизатором Microsoft?
#if defined(_MSC_VER) && (_MSC_VER >= 1400)
# pragma intrinsic(_ReadWriteBarrier)
# define MEMORY_BARRIER() _ReadWriteBarrier()
#elif ...
#elif defined(__GNUC__)
# define MEMORY_BARRIER() __asm__ __volatile__ ("" ::: "memory")
#else
# define MEMORY_BARRIER()
#endif
Под GCC, приведенный выше код может быть использован, чтобы приручить оптимизатор. Хотя функция называется MEMORY_BARRIER
, важной частью является встроенная сборка с пометкой volatile
. Это та часть, которая приручает оптимизатор под GCC, Clang и Intel.
EDIT: Рядный сборка не приручить оптимизатор на Clang, хотя Clang утверждает, что GCC определяя __GNUC__
. См. LLVM Bug 15495 - dead store pass ignores memory clobbering asm statement.
Использование макроса - это класс handle
. handle
обеспечивает один уровень и косвенность, и мы пытаемся вызвать разыменование указателя NULL, чтобы помочь найти ошибки (некоторые отказы от руки). Для достижения нашей цели, мы должны убедиться, оптимизатор не удаляют мертвый магазин (m_p = NULL;
):
template <class T> handle<T>::~handle()
{
delete m_p;
m_p = NULL;
MEMORY_BARRIER();
}
Я не хочу использовать volatile
бросок, потому что (1) Я не верю в его правильное использование квалификатора (взятое из взаимодействий с разработчиками Clang и GCC), и (2) появляется volatile
листинг - неопределенное поведение в C++ (см. Approved way to avoid lvalue cast warnings and errors?).
Устраняет ли барьер памяти оптимизатор на платформах Microsoft?
В качестве альтернативного решения, если вы хотите установить «m_p» в ноль, не заботясь об оптимизации, вы можете использовать «SecureZeroMemory()», когда Windows является целью. Для других целей вы можете назвать некоторые другие API или функцию сборки? –
@ Майкл - да, согласился.Если бы я мог повторно использовать код барьера памяти, тогда он хорошо подбирает вещи, скрывая конкретные детали реализации, которые соответствуют макросу (и без необходимости в дополнительных макросах и '_Pragma', и все условные обозначения, которые его сопровождают). – jww