2010-05-29 4 views
0

변수가 반환 될 때 단계별로 어떤 일이 발생합니다. 그것이 내장되어 있고 적합하다면, 그것은 rax/eax/ax에 던져 질 것입니다. 적합하지 않거나 내장되지 않은 경우 어떻게됩니까? 더 중요한 것은 보장 된 복사 생성자 호출이 있는가?C++에서 변수를 반환하면 어떻게됩니까?

편집 : 소멸자는 어떻습니까? "때때로", "항상"또는 "결코"라고 불리는 것이 있습니까?

+3

운영 체제의 규칙에 따라 다릅니다. – WhirlWind

답변

7

반환 값이 저장되는 곳은 전체적으로 calling convention에 따라 달라지며 아키텍처 및 시스템별로 매우 다릅니다.

컴파일러에서 복사 생성자에 대한 호출을 삭제할 수 있습니다 (즉, 복사 생성자를 호출 할 필요가 없음). 함수의 반환 값은 함수의 반환 값으로 수행되는 작업에 따라 대입 연산자를 호출 할 수도 있습니다.

+0

소멸자가 로컬 버전에 대해 호출 된 적이 있습니까? –

+0

@wowus : 아니요, 실제로 "로컬 버전"이 없기 때문입니다. 복사 생성자에 대한 호출이 생략되면 반환되는 객체는 반환 값에서 현재 위치에서 생성됩니다. –

+0

@wowus : 복사본이 없으면 소멸자를 호출하면 해당 인스턴스가 유효하지 않게됩니다. – kennytm

2

함수/메서드 반환 유형이 참조이면 효과적으로 복사 할 수 없습니다. 참조가 반환되지 않는 유형이면 이 플랫폼의 호출 규칙에 따라 수행 될 수 있습니다.

레지스터가 많이 들어있는 (일반적으로 RISC) 아키텍처에는 적절한 반환 구성을 유지하기 위해 레지스터를 많이 할당 할 수 있습니다. 이는 캐시/레지스터 트랜잭션과 비교하여 비용이 많이 드는 과도한 메모리 트랜잭션을 피하기위한 것입니다.

귀하의 질문에 언급 된 레지스터에 의해 암시 된 x86 계열 인텔 계열에서 RISC가 복사 생성자를 호출하는 것보다 가능성이 큽니다.

관련 문제