Рассмотрим этот код C:
extern volatile int hardware_reg;
void f(const void *src, size_t len)
{
void *dst = <something>;
hardware_reg = 1;
memcpy(dst, src, len);
hardware_reg = 0;
}
Вызов memcpy()
должен происходить между двумя назначениями.В общем, поскольку компилятор, вероятно, не знает, что будет делать вызываемая функция, он не может переупорядочить вызов функции до или после присваивания.Однако в этом случае компилятор знает, что будет делать функция (и может даже вставить встроенную встроенную замену), и он может сделать вывод, что memcpy()
никогда не сможет получить доступ к hardware_reg
.Здесь мне кажется, что компилятор не видит проблем в перемещении вызова memcpy()
, если он хочет это сделать.
Итак, вопрос: достаточно ли одного вызова функции для того, чтобы создать барьер памяти, которыйможет помешать переупорядочению или, в противном случае, явный барьер памяти, необходимый в этом случае до и после вызова memcpy()
?
Пожалуйста, исправьте меня, если я неправильно понимаю.