假设我有一个函数,它接受一些指针参数 - 一些非常量,它可以通过它写入,一些常量,它只能通过它读取。示例:
void f(int * a, int const *b);
还假设该函数不会以其他方式写入内存(即不使用全局变量、固定地址、将 const 指针重新转换为非 const 等技巧)。
现在,为了实现
restrict
内所有读取的 f()
的好处,仅输出参数 restrict
是否足够(根据 C 语言标准)?即在示例中,限制 a
但不限制 b
?
一个简单测试(GodBolt)表明这样的限制应该足够了。此来源:
int f(int * restrict a, int const * b) {
a[0] += b[0];
return a[0] + b[0];
}
int all_restricted(int * restrict a, int const * restrict b) {
a[0] += b[0];
return a[0] + b[0];
}
为 x86_64 生成相同的目标代码:
f:
mov eax, DWORD PTR [rsi]
mov edx, DWORD PTR [rdi]
add edx, eax
mov DWORD PTR [rdi], edx
add eax, edx
ret
all_restricted:
mov eax, DWORD PTR [rsi]
mov edx, DWORD PTR [rdi]
add edx, eax
mov DWORD PTR [rdi], edx
add eax, edx
ret
但这不是一般保证。
指针上的
const
关键字是一个绑定承诺,即你不会(不能)修改指针指向的内存;然而,它没有说明其他人是否可能这样做。因此,我认为即使是 const
指针也可以从 restrict
关键字中受益,因为它保证该指针指向的内存不会被任何人修改。