我在使用Aztec线性系统求解程序库时遇到了奇怪的行为。使用valgrind,我发现这个库在重叠缓冲区上执行一个memcpy。规范指出,没有定义重叠缓冲区上的memcpy行为。事实证明,许多机器上的memcpy具有相同的行为,就像使用for循环那样,因此可以安全地从更高的源复制到较低的目的地:
for(int i = 0; i < len;
gcc编译器在将memcpy添加到函数参数时生成对__restrict的调用。编译器/标准库是如何在适当的时候生成对memcpy的调用的?call_stdcpy_r(int *__restrict p, int *__restrict q, int sz) {
std::copy(p, p+sz, q); // generates call to memcpycall_stdcpy(int *p, int *q, in