2012-05-26 3 views
5

내가 이해하는 한, 성능을 향상시키지 못하기 때문에 C++에서 간단한 형식을 참조로 전달해서는 안되며, 성능 (?)에도 좋지 않습니다. 적어도 내가 그물에서 모을 수 있었던 것.간단한 유형을 참조로 전달하지 않는 이유는 무엇입니까?

이유는입니다. 성능이 좋지 않은 이유는 그것이 C++이 새로운 단순 유형을 만드는 것이 더 빠르기 때문입니다. 변수가 너무 많거나 무엇입니까?

+1

"성능"고려 사항이 없어도 참조 매개 변수가 호출 의미를 변경합니다. ... –

+0

상수 레퍼런스 (컴파일러가 이것을 값으로 전달)로 전달하면 컴파일러 최적화가 될 것으로 기대합니다. –

답변

6

, 그건 :

pointer to memory location -> memory location 

당신이 값을 사용하는 경우가있다 : 값이 어느 쪽이든 (참조 또는 값)을 복사해야하기 때문에

memory location 

참조로 전달해도 성능은 향상되지 않습니다. 한 가지 추가 조회가 이루어져야합니다. 그래서 이론적으로 성능을 "악화"시키지만, 어느 정도는 알 수 없습니다.

+0

오해의 소지가있는 답변입니다. _ "값을 양방향으로 복사해야하기 때문에"_. ref를 통해 전달하면 값이 복사되지 않고 대신 동일한 객체에 포인터 작업이 사용됩니다. 따라서 'double'을 전달하는 것은'double'의 사본을 생성하고 (lvalue 인 경우) 해당 함수에서 그 사본을 사용하는 것을 의미합니다. 참조를 전달하면 값을 사용할 때마다 포인터를 함수에 전달하고 역 참조를 수행하지만 스택에 var를 넣지는 않습니다. 값 arg를 가진 다른 함수를 호출하는 ref 인자를 가진 함수가 있다면, 두번째 함수 만이 스택에 var를 할당 할 것입니다. –

+0

@AdamHunyadi : 참조로 전달하면 포인터가 복사됩니다 (최적화까지). 그것이 내가 "하나의 가치"를 의미하는 것입니다. (인용 한 부분 다음에 괄호로 묶는 부분을 읽으면 알 수 있습니다.) – Ryan

0

내부적으로 참조는 포인터로 처리됩니다. 포인터는 액세스 할 때마다 역 참조 할 필요가 있습니다. 분명히 추가 작업이 필요합니다.

+0

참조는 포인터가 아닙니다. 또한 참고 문헌을 포인터로 생각하지 않아도됩니다. –

+0

로컬 범위에서 작성된 참조에 동의 할 수 있지만 참조로 메소드를 전달하는 것은 어떨까요? 값으로 전달하지 않으면 (읽기 : 스택에 사본을 넣음), 참조 된 객체에 대한 포인터를 전달할 유일한 다른 선택입니다. 스택이나 레지스터를 통해 무언가를 전달해야하므로 전체 값이나 포인터 여야합니다. 그리고 참조는 분명히 전체 값이 아니기 때문에 포인터가되어야합니다. 필자는 C#과 Java의 "간단하게 작동합니다"방식으로 생각하지만, 내부적으로는 자동 역 참조 포인터처럼 작동합니다. – Wormbo

+0

이제 구현 세부 사항에 언어 구문 (포인터/참조)을 매핑하고 있습니다. 이것은 덜 유용합니다. –

0

예를 들어, 32 비트 모드에서 int 크기는 4 바이트이고 int * 포인터 크기는 4 바이트입니다. 4 바이트 포인터를 전달한 다음 해당 포인터로 int을로드하는 것보다 4 바이트 int을 직접 전달하는 것이 더 빠릅니다. 당신이 참조를 만들 경우

+0

@Loki Astari : 일부 구성의 매개 변수는 항상 포인터 또는 값이어야하는 메모리에서로드되지만 포인터 인 경우에는 값 자체가 매개 변수로 전달되는 경우가 아닌 메모리의 다른로드가 있습니다. – Ruben

2

여러분이 묻는 것은 좋은 질문입니다. 코드에주의를 기울이고 있음을 보여줍니다. 그러나 좋은 소식은이 특별한 경우에는 쉬운 방법이 있다는 것입니다. 그것은 진짜가 반드시 읽어야입니다, Want Speed? Pass by Value.

솔직히,이 링크 정의가 그것을 요약하지 않습니다

데이브 Abrahms의이 우수한 기사는 모든 질문에 어떤 대답을 제공합니다. 그러나 긴 이야기를 짧게하기 위해 컴파일러는 올바르게 수행하기에 충분히 똑똑하고 수동으로 시도하면 컴파일러가 특정 최적화를 수행하지 못할 수 있습니다.

관련 문제