在函数原型中是顶级易失性还是​​限制性的?

在函数原型中是顶级易失性还是​​限制性的?,第1张

概述以下原型有什么实际区别吗? void f(const int *p);void f(const int *restrict p);void f(const int *volatile p); C11 6.7.6.3/15(最后一句)部分说明顶层限定符不是为了确定类型兼容性而考虑的,即允许函数定义在其参数上具有与原型不同的顶级限定符.声明了. 然而(与C不同)它并没有说它们被完全忽略了.在c 以下原型有什么实际区别吗?

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中被忽略了.

总结

以上是内存溢出为你收集整理的在函数原型中是顶级易失性还是​​限制性的?全部内容,希望文章能够帮你解决在函数原型中是顶级易失性还是​​限制性的?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1227552.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存