C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在函数原型中是顶级易失性还是​​限制性的?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
以下原型有什么实际区别吗?

void f(const int *p);

void f(const int *reStrict p);

void f(const int *volatile p);

C11 6.7.6.3/15(最后一句)部分说明顶层限定符不是为了确定类型兼容性而虑的,即允许@L_618_0@定义在其参数上具有与原型不同的顶级限定符.声明了.

然而(与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    $1,%eax
    movl    %eax,b(%rip)
    popq    %rbp
    ret
main:
    pushq   %rbp
    movq    %rsp,%rbp
    subq    $16,%rsp
    movl    $42,-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中被忽略了.

大佬总结

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

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。