加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 07:11:06 所属栏目:百科 来源:网络整理
导读:以下原型有什么实际区别吗? void f(const int *p);void f(const int *restrict p);void f(const int *volatile p); C11 6.7.6.3/15(最后一句)部分说明顶层限定符不是为了确定类型兼容性而考虑的,即允许函数定义在其参数上具有与原型不同的顶级限定符.声明了
以下原型有什么实际区别吗?

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读