標籤:

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, std::unique_ptr&b, std::unique_ptr& c)
{
*a += *c;
*b += *c;
}

-O3 -std=c++11

f(std::unique_ptr& &>, std::unique_ptr& &>, 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和restrict完全是兩碼事。


當然需要。unique_ptr又不保證不get()


推薦閱讀:

在校學生深入學習QT後會不會找不到比較好的工作?
面試 C++ 被人問你是如何優化你的代碼的,該從哪些方面進行回答?
為什麼 C++ 標準不明確二進位介面 (ABI) 標準?
關於Qt性能的損失,有沒有一個可以量化的概念?

TAG:C |