在函数原型中是顶级易失性还是??限制性的?
发布时间: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中被忽略了. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |