voID f(const int *p);voID f(const int *restrict p);voID f(const int *volatile p);
C11 6.7.6.3/15(最后一句)部分说明顶层限定符不是为了确定类型兼容性而考虑的,即允许函数定义在其参数上具有与原型不同的顶级限定符.声明了.
然而(与C不同)它并没有说它们被完全忽略了.在const的情况下,这显然没有实际意义;但是在挥发性和限制的情况下可能存在差异.
例:
voID f(const int *restrict p);int main(){ int a = 42; const int *p = &a; f(p); return a;}
原型中是否存在restrict允许编译器优化读取a for return a; ?
(Related question)
解决方法 如果标准中没有任何内容,则由编译器决定,但似乎至少对于gcc 4.9(对于x86),它们会被忽略.检查我用来取笑编译器的这个小片段:static int b;voID f(const int *p) { b = *p + 1;}int main(){ int a = 42; const int *p = &a; f(p); return a;}
如果我按原样编译它,我得到
f(int const*): pushq %rbp movq %rsp,%rbp movq %rdi,-8(%rbp) movq -8(%rbp),%rax movl (%rax),%eax addl ,%eax movl %eax,b(%rip) popq %rbp retmain: pushq %rbp movq %rsp,%rbp subq ,%rsp movl ,-12(%rbp) leaq -12(%rbp),%rax movq %rax,%rdi call f(int const*) movl -12(%rbp),%eax leave ret
如果我使用voID f(const int * __ restrict__ p)编译它,%eax leave ret
如果我使用voID f(const int * __ volatile__ p)编译它,我得到了
f(int const*): pushq %rbp movq %rsp,%eax leave ret
所以在实践中它们似乎也在C中被忽略了.
总结以上是内存溢出为你收集整理的在函数原型中是顶级易失性还是限制性的?全部内容,希望文章能够帮你解决在函数原型中是顶级易失性还是限制性的?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)