我正在研究通过将 C99限制类型限定符添加到数组的类型参数来允许编译器进行的优化。
例如,考虑下面的函数f:
int f(int* restrict a[2]) {
*(a[0]) = 10;
*(a[1]) = 11;
return *(a[0]);
}
Run Code Online (Sandbox Code Playgroud)
它采用一个由指向整数的限制指针组成的二元素数组a作为参数。该函数存储10到对象a[0]指向和11对象a[1]指向。a[0]最后,它返回该对象指向的值。
因为指针a[0]和a[1]是限制限定的,所以我假设编译器有足够的信息来执行典型的优化,即不再次加载a[0],而是直接返回(因为如果程序已定义行为,则10写入a[1]不能更改对象指向a[0])。
因此,如果优化发生在“C 代码级别”,则该函数将变为:
int f(int* restrict a[2]) {
*(a[0]) = 10;
*(a[1]) = 11;
return 10;
}
Run Code Online (Sandbox Code Playgroud)
然而,GCC 和 Clang(我尝试了几个版本,其中最新的是 Godbolt)都没有执行此优化(当使用 -O3 编译时)。
GCC13.2 发出的 X86 程序集是
f:
mov rax, QWORD PTR [rdi]
mov …Run Code Online (Sandbox Code Playgroud)