当指针是 __restrict 类型时,编译器从 std::copy 生成对 memcpy 的调用?

Compiler generates call to memcpy from std::copy when pointers are of __restrict type?

当我将 __restrict 添加到函数参数时,gcc 编译器生成对 memcpy 的调用。 compiler/standard 库如何确定它可以在适当的时候生成对 memcpy 的调用?

void call_stdcpy_r(int *__restrict p, int *__restrict q, int sz) {
  std::copy(p, p+sz, q); // generates call to memcpy
}

void call_stdcpy(int *p, int *q, int sz) {
  std::copy(p, p+sz, q); // generates call to memmove
}

根据https://en.cppreference.com/w/cpp/algorithm/copy

The behavior is undefined if the source and the destination ranges overlap.

原则上,编译器不应该一直生成对 memcpy 的调用吗?

Link 神马:https://godbolt.org/z/aKj3Y5K8M

您的报价适用于 std::copy_if,不适用于 std::copy

std::copy 的唯一要求是 q 不在 [p,p+sz) 范围内。允许目标范围重叠,因此 memmove 是唯一没有额外假设的选项,例如由 __restrict 引入的。

__restrict 保证编译器范围不会重叠。