2012-01-29 5 views
8

스마트 포인터는 포인터 아래에 있으므로, shared_ptr 또는 다른 포인터의 별칭이 아닌 함수에 shared_ptr 매개 변수를 정의하는 방법이 있습니까?__restrict__을 shared_ptr <T>에 적용 할 수 있습니까?

또는 무엇인가 불필요한가요?

저는 gcc> = 4.2 및 llvm-clang> = 2.0 컴파일러에 관심이 있습니다 (다른 컴파일러에 대한 대답도 흥미로울 것입니다).

+0

C++에는'restrict' 또는'__restrict__' 키워드가 없습니다. 특정 컴파일러에서 언어 확장 기능에 대해 질문하는 경우 어떤 컴파일러를 사용해야할지 결정해야합니다. –

+0

@BenVoigt 죄송합니다 - 편집 됨. – James

+3

제한된 포인터에 대한 작업을 원한다면 포인터의 공유 소유권을 주장하려고 할 것 같지 않습니다. 공유 소유권이있는 시스템에서 포인터가 실제로 별개임을 알게됩니다. 어쨌든, 나는 당신의 함수가 실제로'std :: shared_ptr 's가 아닌 [제한된] 포인터를 가져 가고 싶어한다고 생각한다. –

답변

7

.get()으로 포인터를 추출하고 __restrict__으로 표시하십시오. 기억할 것은 __restrict__을 함수 매개 변수에 넣는 것은 __restrict__을 지역 변수에 넣는 것과 같습니다. 특히, 컴파일러는 분명히 동일한 객체를 가리키는 포인터 두 개를 사용하여 함수를 호출하지 못하도록 시도하지 않습니다. 예 : foo(i,i). 특정 포인터가 더 최적화를 수행하도록 컴파일러 수 있도록 서로를 참조하지 않는 컴파일러에 대한 약속을 확인하려면

, 다음 아래 코드를 사용하고 xp를 통해 작업을 대신 xyyp .

#include<iostream> 
#include<memory> 
using namespace std; 

void foo(shared_ptr<int> x, shared_ptr<int> y) { 
     int * __restrict__ xp = x.get(); 
     int * __restrict__ yp = y.get(); 
} 

int main() { 
     shared_ptr<int> i = make_shared<int>(3); 
     shared_ptr<int> j = make_sharet<int>(4); 
     foo(i,j); 
} 
+2

왜 마킹 함수 매개 변수는'restrict'와 같이 지역 변수'restrict' 포인터 변수를 선언하는 것과 다르다고합니까? 그것은 gcc 최적화와 관련이 있거나'restrict'의 근본적인 행동입니다 (현재 이해하지 못하고 있습니다). –

+0

저는 그것이 다르지 않다고 말합니다. 나는 그것을 더 명확하게 다시 말하려고 노력할 것이다. –

+0

이 글을 쓸 예정 이었지만 로컬 변수에 허용되었는지 여부를 말하는'__restrict__' 문법을 찾을 수 없었습니다. 어딘가에 문서가 있습니까? –

5

당신은 당신이 명시 적으로 비 앨리어스 포인터 매개 변수를 취하는 작업자 루틴에 위임 할 수있는 공유 포인터와 관련된 기본 객체가 아닌 별칭이 작업을 수행하려면 다음

void worker (mytype *__restrict x, mytype *__restrict y) 
{ 
    // do something with x, y with a no-alias guarantee 
} 

int main() 
{ 
    std::shared_ptr<mytype> p(new mytype); 
    std::shared_ptr<mytype> q(new mytype); 

// explicitly delegate the shared object 
    worker(p.get(), q.get()); 

    return 0; 
} 

아니에요을 분명히 염두에 두어야 할 것이지만 이것은 고수준 메모리 관리가 스마트 포인터에 의해 안전하게 다루어 지도록하며, 로우 레벨 작업을 수행하는 동안 노 앨리어스 포인터를 사용하는 것이 더 효율적입니다.

@BenVoigt가 지적한대로 restrict은 공식적으로 c99의 일부입니다. c++은 그것에 대해 아무것도 알지 못합니다. MSVC__restrict을 통해 지원하며 GCC__restrict__입니다.

희망이 도움이됩니다.

관련 문제