百科问答小站 logo
百科问答小站 font logo



C++ 需要 restrict 关键字吗? 第1页

  

user avatar   lan-se-52-30 网友的相关建议: 
      

谢邀。就我所知的C++编译器,无论是GCC,Clang,VC++,IBM XL C++等,这些主流的C++编译器都提供了restrict关键字的支持,只是似乎书写的形式有所变化,如可能是__restrict__,__restrict等 ,而restrict是限制Pointer Alias的,这和unique_ptr完全是两码事,限制Pointer Alias有助于编译器做优化。至于为什么C++标准委员会不加,我现在也不知道,我也感觉很诧异,不过下次我会记得问导师Michael,但是可能要等到8月份了,我现在手上也有一大堆的C++问题等着问他,包括Module System是否在C++17挂掉了等,因为我上次看见有人在我的评论说这个挂了,我比较疑惑。

然后补充一下restrict的用法,我以GCC产生汇编指令的例子来补充一下,比较直观

       void f(int *a, int *b, int *c)  {   *a += *c;   *b += *c; }      

-O3后的汇编代码

       f(int*, int*, int*):  movl (%rdx), %eax  addl %eax, (%rdi)  movl (%rdx), %eax  addl %eax, (%rsi)  ret      

加上restrict

       void f(int * __restrict__ a, int* __restrict__ b, int* __restrict__ c) {   *a += *c;   *b += *c; }      

-O3后

       f(int*, int*, int*):  movl (%rdx), %eax  addl %eax, (%rdi)  addl %eax, (%rsi)  ret      

可以很清楚的看见是4条指令变为了3条指令,而少掉的一条就是第二次的load c

然后看看unique_ptr

       #include <memory> using namespace std; void f(std::unique_ptr<int> a, std::unique_ptr<int>b, std::unique_ptr<int> c) {   *a += *c;   *b += *c; }       

-O3 -std=c++11

       f(std::unique_ptr<int, std::default_delete<int> >, std::unique_ptr<int, std::default_delete<int> >, std::unique_ptr<int, std::default_delete<int> >):  movq (%rdx), %rdx  movq (%rdi), %rax                  ; *a += *c  movl (%rdx), %ecx  addl %ecx, (%rax)   movq (%rsi), %rax                  ; *b += *c  movl (%rdx), %edx  addl %edx, (%rax)  ret      

所以,可见,unique_ptr和restrict完全是两码事。




  

相关话题

  g++是否有扩展指令可以控制全局变量的构造顺序? 
  关于Qt性能的损失,有没有一个可以量化的概念? 
  为什么同为系统级编程语言,Rust 能拥有现代构建/包管理工具,C++ 却不能? 
  C 与 C++ 谁的效率高,为什么? 
  为什么 C++ 中一个类的成员类型不能是该类本身,而 C# 中就可以? 
  C++中 unsigned t = 2147483647 + 1 + 1; 是 UB 还是 ID? 
  大一下要学C++,电脑安装不上net4.0,有什么在线编程网站可以尽可能替代VS,拿来练习。? 
  如何学习递归呢? 
  p是char类型指针,p[1]不是指向p[0]的下一个字节吗?为什么会到0x11? 
  C++ STL中的map用红黑树实现,搜索效率是O(lgN),为什么不像python一样用散列表从而获得常数级搜索效率呢? 

前一个讨论
历史上有哪些很厉害的骗局?
下一个讨论
有哪些我们习以为常,其实似是而非的历史观?





© 2025-05-29 - tinynew.org. All Rights Reserved.
© 2025-05-29 - tinynew.org. 保留所有权利