nvcc、gcc、clang 和 msvc 是否在结构中"respect"__restrict__关键字?
Do nvcc, gcc, clang and msvc "respect" the __restrict__ keyword within structs?
假设我有
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
中使用的语义不同。
相关文章:
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- C++中的"inline"关键字
- 如何确保C++函数在定义之前声明(如override关键字)
- 谷歌模拟和覆盖关键字
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 为什么"delete"关键字不删除节点?
- 在 c++ 中正确定义"this"关键字?
- 这个额外的关键字在这个 c++ 类声明中是什么意思?
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- C++ - 为什么这里需要'template'关键字?
- C++函数的关键字?
- 使用 'typename' 关键字将非类型视为依赖上下文中的类型
- "friend"关键字在C++中是什么意思?
- 声明C++数组(带或不带 "new" 关键字)
- 对齐和对齐的实际用例C++关键字
- 在 c++ 中三元运算符中不允许继续(关键字)吗?
- 考虑到其他好处,关键字'auto'真的有助于简化调试C++吗?
- nvcc、gcc、clang 和 msvc 是否在结构中"respect"__restrict__关键字?