2014-02-22 3 views
2

그래서 나는 내가 작성한 코드를보고 내 자신의 사업에 관심이 있었고, 내가 한 일을 알아 차렸다. float& px = A->p.x 보호 된 데이터에 대한 참조를 만들었습니다. if 문의 너비를 줄이고 더 읽기 쉽게하기 위해이 작업을 수행했습니다. 이 기능은 물론 클래스의 친구로 명시되어있어 보호 된 데이터에 액세스 할 수 있습니다. 또한, 4 개의 유사한 참조가있었습니다.로컬에서 액세스 할 수있는 데이터의 참조에 대한 유효한 이유는 무엇입니까?

이것이 유효한 이유인지 궁금합니다. 하지 함수에 대한 매개 변수에서 근무하고 어떠한 방식에 대한 참조를 만들 수있는 타당한 이유가있는 경우

예 :.

void generic_function(A_class* A) 
{ 
float& x = A->x; 
//purposeful and valid code using x? 
} 

내가 질문 최선 내가 할 수있는 말을했는데, I 부탁하는 나의 목적을 전달하지 않으면 사과드립니다.

편집 : 중요 시점. 실시간 응용 프로그램 디자인을위한 최적화에 관심이 있습니다.

+0

당신이 "유효"무엇을 의미합니까 실제로 유효한 코드를 만들어? "좋은 생각"또는 "잘 정의 된 행동을하는 법적"을 의미합니까? 둘 다 그렇습니다. –

+0

그렇게하는 것이 합당한 이유입니다. 그래서 나는 "좋은 생각"유형의 이유를 추측합니다. 실시간 응용 프로그램을 프로그래밍 할 때 주로 최적화가 걱정됩니다. –

+0

나는 클래스 생성자에서 포인터를 전달한 다음 값을 참조로 저장하는 것을 좋아한다. 그렇게하면 호출자는 객체가 새 객체의 수명 동안 유효해야하지만 사용하기가 더 편리 할 필요가 있음을 분명히 알 수 있습니다. – user1520427

답변

3

물론 이것은 참조를 사용하는 매우 유효한 방법입니다. 코드를 단축하기 위해 메모리의 다른 위치에 스탠드 인이 필요할 때마다 참조는 완벽한 선택입니다. 귀하의 경우에는 참조 해제 체인을 단축합니다. 예를 들어 루프 내에서 x을 여러 번 사용하는 경우 을 읽을 필요가 없으므로 참조 해제 횟수를 줄일 수 있습니다. x . 컴파일러는이 참조를 최적화 할만큼 똑똑 할 수 있으므로 마이크로 최적화의 문제로해서는 안됩니다.

참조를 사용하는 또 다른 타당한 이유는 컨테이너 내부의 캐시 된 값에 액세스하는 것입니다. std::map에서 캐시 된 값에 액세스하기위한 일반적인 패턴은 값을 참조로 읽어서 확인한 다음 참조에 할당하여지도에서 두 번째 조회를 무시하는 것입니다. 이 타이밍은 특히 좁은 루프에서 중요 할 수 있으므로지도에 참조를 사용하는 것이 최적화 기술로 간주 될 수 있습니다.

+0

매우 유용한 답변입니다. 당신이 다른 예제들을 생각할 수 있다면, 나는 그것을 읽는 것을 좋아할 것입니다. –

+0

@ JoshC 두 번째 부분은 일반적인 패턴입니다. 컨테이너에 로컬 참조를 사용하여 비용을 복사하고 검색하는 것을 피할 수 있습니다. – dasblinkenlight

+0

나는 두 가지 점에서 약간 혼란 스럽다. 아마도이 전체적인 질문에 대한 사용법의 유형에 대한 참조일지도 모르겠다. 권리? 그것보다 더, 나는 "INTO 용기 참조"에 혼란 스럽다. 그게 무슨 뜻인지는 모르겠다. 컨테이너를 통해 움직이는 참조?또는 특정 객체를 찾으면 참조를 만들고 다시 검색 할 필요가 없습니다. –

2

참조는 참조 된 개체의 별칭 일 뿐이므로 사용자가하는 것처럼 함수 내에서 사용하려면 추가 메모리 오버 헤드 나 성능 비용이 들지 않습니다. 코드를 깨끗하게하면 결과를 사용하지 않을 이유가 없습니다.

// logFile is optional; if set, the function will log to that file 
// If it's empty, it will log to stderr 
void foo(const std::string& logFile) 
{ 
    std::ofstream file; 
    std::ostream& os = (logFile.empty()) ? std::cerr : file; 
    if (!logFile.empty()) 
    { 
     file.open(logFile); 
     // validate that the file opened successfully, etc. 
    } 

    // Then, throughout the function, I can just use os rather than writing 
    // an if statement every time I log something 
    os << "Hello world!\n"; 
} 

편집 :

+0

새해 복 많이 받으세요. 지금은 더 분명해지기를 바랍니다. – jaho

+0

@JoshC :이 경우 컴파일시 참조가 해석되므로 스택에 추가 메모리가 할당되지 않습니다. – jaho

+0

매우 명확합니다. 고맙습니다. 스택에 할당되는 메모리가 없기 때문에 사실 인상적입니다. 지역화 된 참조의 모든 경우에 해당되는 한, 이는 놀랄만 한 일입니다. –

2

내가 좋아하는 일을하기 위해 여러 번 사용하고 난

+0

오, 세상에, 나는'?'또는':'를 사용하는 법을 배웠으므로 코드가 약간 혼란 스럽습니다. 비록 멋져 보입니다. –

+0

그것은 [삼항 연산자]입니다 (http://en.wikipedia.org/wiki/%3F :). if 문과 비슷하지만 값이 있습니다 – Cornstalks

+0

알아요? 일종의, 나는 단지 그것을 사용하는 법을 배웠습니다. 언젠가는 그렇게 할 것입니다. 나는 그것이 정말로 유용 할 것이라고 확신하지만, 지금 당장 나는 비 일상적으로 다형성을 배우고있다. 비 유적으로 말하면서 두통을 느꼈습니다. –

관련 문제