C++__restrict用于什么以及如何正确使用它



下面代码中的__restrict完全展开了循环,并将程序集缩短了一半以上。但它的含义是什么?应该如何正确使用它?

我在问之前做了研究。。。我发现了这个。但是,唉,我不明白。

// Compile with -O3 -march=native to see autovectorization
void maxArray(double* __restrict x, double* __restrict y) {
for (int i = 0; i < 65536; i++) {
if (y[i] > x[i]) x[i] = y[i];
}
}

Godbolt的编译器浏览器

假设您声明了一些static double array[100000];,然后您的main正在调用maxArray(array, array + 17);

如果没有restrict注释(或GCC扩展(,编译器不允许展开循环(因为两个数组切片重叠(

有了restrict注释,作为程序员,你承诺永远不会发生这种情况(所以你不会在这样的main中执行maxArray(array, array + 17);(,然后编译器可以更积极地优化

memcpy和memmove之间有类似的区别(对于C(,优化编译器会为它们生成不同的代码。

请注意Rice定理,它指出了与这些问题相关的理论局限性。侵略性优化的理论框架可以是抽象的解释。

如果您使用GCC(您可以查看用g++ -Wall -O3 -S -fverbose-asm生成的汇编代码(,您可以使用GCC插件大量改进优化。您还可以使用GCC开发人员选项来了解各种优化,由于GCC是免费软件,您可以研究和改进其源代码。为此预算数月的努力。

如果允许,可以考虑使用C或C++代码的静态分析工具,如Frama-C或Clang静态分析器。

如果允许的话,除了调试器(例如GDB及其观察点(之外,还可以考虑使用动态检测技术,如valgrind和地址清理程序。它们确实会减慢你的可执行文件的速度!

最新更新