nvcc、gcc、clang 和 msvc 是否在结构中"respect"__restrict__关键字?

Do nvcc, gcc, clang and msvc "respect" the __restrict__ keyword within structs?

本文关键字:respect 关键字 restrict clang gcc msvc nvcc 是否 结构      更新时间:2023-10-16

假设我有

struct s {
    int* __restrict__ p1;
    double v;
};
void foo(int* __restrict__ p2, struct s my_s) { /* ... */ }

在这种情况下,下面列出的C++编译器是否尊重__restrict__关键字,并假设通过p2的内存访问不会影响通过p1的访问?显然,这与编译器有关,因为restrict不是C++关键字。

我主要对gcc 4.9.x和nVIDIA CUDA 7.5的nvcc的答案感兴趣(当然是在编译设备代码时,而不是在转发到主机编译器时)。关于clang、gcc和msvc++的当前版本的答案也很有趣。

GCC似乎表示是的,但我可以想象,在引擎盖下,它对这些类型的事情都很聪明,可能会完全忽略关键字存在的事实。

我也愿意打赌,如果你用限制关键字和不用限制关键字来描述你的方法,几乎没有区别。

如果你这样做,我很想知道结果。

还有这个答案,读起来可能很有趣。

最后,这个博客似乎表明nvcc支持这个关键字。

现在我真的很好奇分析代码的结果。

Microsoft C++AMP(带有MSVC++2015)

作为结构成员的指针上的__restrict__是官方不支持的(emphasis mine):

以下内容是不允许的:

  • 递归
  • 用volatile关键字声明的变量
  • 虚拟功能
  • 指向函数的指针
  • 指向成员函数的指针
  • 结构中的指针
  • 指针对指针
  • goto语句
  • 带标签的语句
  • try、catch或throw语句
  • 全局变量
  • 静态变量。请改用tile_static关键字
  • dynamic_cast强制转换
  • typeid运算符
  • asm声明
  • Varargs

Microsoft Visual C++2015

一般来说,与AMP C++代码相比,MSVC支持什么还不太清楚。我们看到一个__restrict__union声明中使用的例子,所以它不仅仅是函数的参数上的修改,而且语义与在struct中使用的语义不同。