C++ 需要 restrict 關鍵字嗎?
這本來是個C語言的關鍵字,描述在這裡:restrict
目前在C++里,這個特性沒有得到標準支持,只有編譯器特定的實現。為什麼C++不增加這個特性?是因為unique_ptr本身已經包含了這個語義嗎?
謝邀。就我所知的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 &
using namespace std;
void f(std::unique_ptr&
{
*a += *c;
*b += *c;
}
-O3 -std=c++11
f(std::unique_ptr&
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又不保證不get()
推薦閱讀:
※在校學生深入學習QT後會不會找不到比較好的工作?
※面試 C++ 被人問你是如何優化你的代碼的,該從哪些方面進行回答?
※為什麼 C++ 標準不明確二進位介面 (ABI) 標準?
※關於Qt性能的損失,有沒有一個可以量化的概念?
TAG:C |