스마트 포인터는 포인터 아래에 있으므로, shared_ptr
또는 다른 포인터의 별칭이 아닌 함수에 shared_ptr
매개 변수를 정의하는 방법이 있습니까?__restrict__을 shared_ptr <T>에 적용 할 수 있습니까?
또는 무엇인가 불필요한가요?
저는 gcc> = 4.2 및 llvm-clang> = 2.0 컴파일러에 관심이 있습니다 (다른 컴파일러에 대한 대답도 흥미로울 것입니다).
스마트 포인터는 포인터 아래에 있으므로, shared_ptr
또는 다른 포인터의 별칭이 아닌 함수에 shared_ptr
매개 변수를 정의하는 방법이 있습니까?__restrict__을 shared_ptr <T>에 적용 할 수 있습니까?
또는 무엇인가 불필요한가요?
저는 gcc> = 4.2 및 llvm-clang> = 2.0 컴파일러에 관심이 있습니다 (다른 컴파일러에 대한 대답도 흥미로울 것입니다).
.get()
으로 포인터를 추출하고 __restrict__
으로 표시하십시오. 기억할 것은 __restrict__
을 함수 매개 변수에 넣는 것은 __restrict__
을 지역 변수에 넣는 것과 같습니다. 특히, 컴파일러는 분명히 동일한 객체를 가리키는 포인터 두 개를 사용하여 함수를 호출하지 못하도록 시도하지 않습니다. 예 : foo(i,i)
. 특정 포인터가 더 최적화를 수행하도록 컴파일러 수 있도록 서로를 참조하지 않는 컴파일러에 대한 약속을 확인하려면
, 다음 아래 코드를 사용하고 xp
를 통해 작업을 대신 x
및 y
의 yp
.
#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);
}
왜 마킹 함수 매개 변수는'restrict'와 같이 지역 변수'restrict' 포인터 변수를 선언하는 것과 다르다고합니까? 그것은 gcc 최적화와 관련이 있거나'restrict'의 근본적인 행동입니다 (현재 이해하지 못하고 있습니다). –
저는 그것이 다르지 않다고 말합니다. 나는 그것을 더 명확하게 다시 말하려고 노력할 것이다. –
이 글을 쓸 예정 이었지만 로컬 변수에 허용되었는지 여부를 말하는'__restrict__' 문법을 찾을 수 없었습니다. 어딘가에 문서가 있습니까? –
당신은 당신이 명시 적으로 비 앨리어스 포인터 매개 변수를 취하는 작업자 루틴에 위임 할 수있는 공유 포인터와 관련된 기본 객체가 아닌 별칭이 작업을 수행하려면 다음
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__
입니다.
희망이 도움이됩니다.
C++에는'restrict' 또는'__restrict__' 키워드가 없습니다. 특정 컴파일러에서 언어 확장 기능에 대해 질문하는 경우 어떤 컴파일러를 사용해야할지 결정해야합니다. –
@BenVoigt 죄송합니다 - 편집 됨. – James
제한된 포인터에 대한 작업을 원한다면 포인터의 공유 소유권을 주장하려고 할 것 같지 않습니다. 공유 소유권이있는 시스템에서 포인터가 실제로 별개임을 알게됩니다. 어쨌든, 나는 당신의 함수가 실제로'std :: shared_ptr's가 아닌 [제한된] 포인터를 가져 가고 싶어한다고 생각한다. –