当指针是 __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
保证编译器范围不会重叠。
当我将 __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
保证编译器范围不会重叠。