考虑以下 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()
调用之前和之后显式地使用内存屏障?
如果我理解有误,请您纠正。
memcpy
的作用。它在标准中有明确规定。 - R.. GitHub STOP HELPING ICE