평가는 일반적으로 발생 그 결과로 전환. 그런 전환 과정에서 평가가 이루어집니다.
내 질문은 : 어떤 기술 (? 자리 표시자를 사용하여, 예를 들어) D의 값이
이러한 종류의 "transfromation"실제로 사용되지 않는 것을 인식 할 수있다 :
Result F = (A*B+sin(C)+3.)*E;
에
Result D = A*B+sin(C)+3.;
Result F = D*E;
D를 평가하지 않을 때 가능합니다.이렇게하려면 일반적으로 D가 실제 인 것처럼 표현 유형을 캡처해야합니다. 예를 들어, auto의 도움으로 그러나
auto &&D = A*B+sin(C)+3.;
Result F = D*E;
, 당신은 자르해야한다 - 때때로 표현 템플릿은 피연산자의에 대한 참조를 캡처하고 당신이 그것을 표현이다 후에 만료 것이다 일부 를 rvalue이있는 경우 :
auto &&D = A*get_large_rvalue();
// At this point, result of **get_large_rvalue** is destructed
// And D has expiried reference
Result F = D*E;
get_large_rvalue은 여기서
LargeMatrix get_large_rvalue();
그것은 결과이다는 get_large_rvalue가 호출되었을 때 전체 식의 말에 만기, 를 rvalue입니다. 표현식 내의 어떤 부분에 포인터/참조를 저장하면 (나중에 평가하기 위해) 평가를 "연기"합니다. 포인터/참조는 가리키고 참조 된 객체보다 오래 지속됩니다. 내가 이해, 자동 유형을 결정하도록 컴파일러에 요청,
auto &&intermediate = get_large_rvalue(); // it would live till the end of scope
auto &&D = A*intermediate ;
Result F = D*E;
나는 C++ (11)에 익숙하지 합니다만 :
이를 방지하려면 어떻게해야 그것의 초기화에서 변수의
그래, 정확히. 이를 Type Inference/Deduction이라고합니다.
C++ 98/03에는 템플릿 함수에만 유형 공제가 있었으며, C++ 11에는 자동이 있습니다.
CUDA와 C++ 11은 어떻게 상호 작용하는지 알고 있습니까?
(나는 OpenCL을를 사용하지만) 나는 CUDA을 사용하지 않은,하지만 난 C++ 11 호스트 코드에는 문제가 없을 것 같아요. 어쩌면 일부 C++ 11 개 기능 장치 코드 내에서 지원되지 않습니다,하지만 당신의 목적을 위해 - 당신은 단지 마지막
호스트 코드 자동 필요 만 C++와 가능성이있다?
pre-C++ 11을 의미합니까? 나는. C++ 98/C++ 03? 네, 가능하지만, 더 구문 노이즈가, 아마도 그 이유는 그것을 거부하는 것입니다 : 지금 Windows에서 CUDA/비주얼 스튜디오 2010을 사용하고 있습니다
// somehwhere
{
use_D(A*B+sin(C)+3.);
}
// ...
template<typename Expression>
void use_D(Expression D) // depending on your expression template library
// it may be better to use (const Expression &e)
{
Result F = D*E;
}
.당신이 두 OS '(당신이 어떤을 알고에, GPGPU와 CUDA) 내 관심의 틀에서 C++ 11을 사용하는 2010
MSVC에 대한 컴파일러/도구 모음/환경 추천 시겠어요 않는 C의 일부를 지원 ++ 11. 특히 자동을 지원합니다. 따라서 (C++ 11) 만 필요한 경우 - MSVC2010은 정상입니다.
그러나 MSVC2012를 사용할 수 있다면 좋습니다. C++ 11 지원이 훨씬 뛰어납니다. 또한
트릭 자동 & & 중간 = get_large_rvalue을(); 그러한 문제를 알지 못하는 제 3 자 사용자에게 "투명"하지 않은 것 같습니다. 내가 맞습니까? 어떤 대안?
표현식 템플리트가 일부 값에 대한 참조를 저장하고 평가를 지연하는 경우. 당신은 평가의 장소에서 참조가 모두 살아 있는지 확인해야합니다. 원하는 방법을 사용하십시오. 자동이 없으면 다음과 같이 자동으로 수행 할 수 있습니다.
LargeMatrix temp = get_large_rvalue();
또는 전역/정적 변수 (덜 선호되는 방법)조차도 가능합니다.
최후의 의견/질문 : 자동을 사용하기 & & D = A * B + 죄 (C) +3; 두 개의 표현식 사이의 할당에 대해 연산자를 오버로드해야합니다. 맞습니까?
아니요, 이러한 양식은 할당 연산자를 복사하거나 이동하거나 생성자를 복사/이동하지 않아도됩니다.
기본적으로 임시 값의 이름을 지정하고 유효 기간이 끝날 때까지 수명이 연장됩니다. Check this SO.
하지만, 다른 형태로 사용한다면 : 어쩌면 컴파일하기 위해 필요한 이러한 경우의 복사/이동/변환 생성자에서
auto D = A*B+sin(C)+3.;
을 (실제 사본이 Copy Ellision를 사용하여 컴파일러에 의해 멀리 최적화 할 수 있지만)
또한 계산을 강제 (중간 표현식) 자동차를 사용하여 결과를 전환함으로써, 타사 사용자에게 투명하지 않은 것으로 보인다. 어떤 대안?
대체 방법이 있는지 확실하지 않습니다. 이것은 표현 템플릿의 본성에 의한 것입니다. 표현식에서 사용하는 동안 - 내부 중간 유형을 반환하지만 일부 "특수"유형으로 저장하면 평가가 트리거됩니다.
산술 표현식이 'for' 루프와 같은 이유는 무엇입니까? –
@JoachimPileborg, [표현 템플릿] (http://eigen.tuxfamily.org/dox-devel/TopicInsideEigenExample.html)이 ** 전체 ** 표현을 수집하고, 구조를 최적화하고 (optionaly), 그렇게 실행할 수 있기 때문에 ** for ** 루프가되어야합니다. http://en.wikipedia.org/wiki/Expression_templates –