假设我有
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 ++当前版本的答案也很有趣。
答案 0 :(得分:2)
GCC似乎表示肯定,但我认为,在这些类型的事情中,他们都很聪明,可能会完全忽略关键字存在的事实。
我也愿意打赌,如果您使用和不使用限制关键字来分析您的方法,那么几乎没有区别。
如果你这样做,我很想知道结果。
还有this的答案可能很有趣。
最后,有this博客似乎表明nvcc支持该关键字。
现在我对分析代码的结果非常好奇。
答案 1 :(得分:0)
<script>
//turn entire div into toggle
function toggle_visibility(id) {
var e = document.getElementById(id);
if (e.style.display == 'block' || e.style.display == '')
e.style.display = 'none';
else
e.style.display = 'block';
}
</script>
关于结构成员的指针是officially unsupported(强调我的):
不允许以下内容:
- 递归。
- 使用volatile关键字声明的变量。
- 虚拟功能。
- 指示功能。
- 指向会员功能的指针。
- 结构中的指针。
- 指针指针。
- 转到声明。
- 标签声明。
- 尝试,捕捉或抛出陈述。
- 全局变量。
- 静态变量。请改用tile_static关键字。
- dynamic_cast演员。
- typeid运算符。
- asm声明。
- 可变参数。
一般而不是AMP C ++代码,它是MSVC支持的much less clear。我们在__restrict__
声明中看到了__restrict__
的一个例子 - 所以不仅仅是对函数的paremeter进行了修改 - 但是在{{1}中使用的语义不同}。