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

问题描述

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

我在问之前做了研究...我找到了 this。但是,唉,我不明白。

// 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's Compiler Explorer

解决方法

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

如果没有restrict注解(或GCC extension),编译器不允许 unroll the loop(因为两个数组切片是重叠的) >

使用 restrict 注释,您作为程序员承诺这永远不会发生(因此您不会在这样的 maxArray(array,array + 17); 中执行 main),然后编译器可以{{ 3}} 更积极

optimizememcpy 之间存在类似的差异(对于 C),并且优化编译器会为它们生成不同的代码。

请注意 memmove,其中说明了与这些问题相关的理论限制。激进优化的理论框架可能是 Rice's theorem

如果您使用 abstract interpretation(您可以查看使用 g++ -Wall -O3 -S -fverbose-asm 生成的汇编代码)您可以使用您的 GCC 和 大量努力改进优化。您也可以使用 GCC GCC plugin 来了解各种优化,并且由于 GCC 是 developer options,您可以研究和改进其源代码。为此预算数月的努力。

考虑对 C 或 C++ 代码使用静态分析工具(如果允许),例如 free softwareFrama-C

除了您的调试器(例如 Clang static analyzer 及其 GDB)之外,如果允许,请考虑使用动态检测技术,例如 watchpointsvalgrind。它们确实会减慢您的可执行文件的速度!

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...