2012-12-18 1 views
1

가능한 중복 :
What’s the difference between passing by reference vs. passing by value?by-value의 메모리 소비가 param을 통과했습니다. 참조에 의한

나는 내 매우 구체적인 질문 (다른 스레드에 나와 있지 않은 것을 믿고, 제목이 다른 많은 대답 질문을 나타낼 수 있다는 사실을 알고 나는 그것이 중복되면 미안하다.) 사업

: 고려 다음 서명 :

A :

void MyFunction(long int x); 

B :

void MyFunction(long int & x); 

하고 다음 사용 :

void main() 
{ 
    short int y = 0; 
    MyFunction(y); 
    ... 
} 

내 질문은 관련이 파의 메모리 소비 MyFunction의 메모리 스택 프레임에 ameter. 사례 A의

  1. 이 파라미터 값에 의해 전달되고, 그것은를 sizeof (짧은 INT) 바이트를 소모 할 것이다 것일까? 짧은 INT보다 아마 인 - 케이스 B에서는

  2. 에서, 파라미터는 상기 컴파일러가 포인터를 구현한다고 가정 의해 참조 전달되고, 그것은를 sizeof를 소비한다 ( POINTER_TYPE)를 바이트 의미 하는가? 는 내가 어떤 효과를 가지고 있는지 알고 싶습니다 함수가 long int와 유형을 수신

주 (I 번 참조를 사용하는 경우는 플랫폼에 따라, 어쨌든 64 개 비트를 소모 할 수 있다는 말을 들었다) 두 경우 모두.

또 다른 작은 질문 - 누구든지 컴파일러가 포인터를 사용하여 매개 변수 전달 매개 변수를 구현하지 못하는 예제를 게시 할 수 있습니까?

감사합니다. Asaf.

+0

마지막 질문에 대한 답변으로 인라인이 마음에 듭니다. –

+0

@KerrekSB, 일단 인라이닝이 완료되면 아무런 문제가 없습니다. 또한 항상 적용 할 수는 없습니다. 예 : '가상'/ 재귀 적/큰 기능. OP는 인라이닝 이외의 경우에 더 관심이 있다고 생각합니다. – iammilind

+0

흥미로운 질문입니다. 그것은 많은 것들에 달려 있습니다. 컴파일러가 생성 한 어셈블리 코드를 살펴 봐야합니다. 그러나 그것은 정말로 중요합니까? 물체가 큰 경우 <64bit는 참조로 전달하고, 같거나 작은 경우 값으로 전달합니다. 어쨌든 64 비트가 다 소모되었다고 가정하십시오. 정수는 어쨌든 (전체 레지스터 크기) CPU 단어로 처리되기 때문에 char도 인수로 64 비트를 차지할 수 있습니다. – rioki

답변

2

답변 반드시, 컴파일러, 아키텍처에 의존하는 ABI

다음과 어떤에서

, 내가 문제의 매개 변수가 실제로 스택에하지 레지스터에 전달한다고 가정 (큰 가정!), 그리고 적극적인 최적화는 없습니다.

경우에 매개 변수가 값에 의해 전달되면 sizeof (short int) 바이트를 사용한다는 의미입니까? 이 MyFunction()의 서명과 일치하는 첫번째 확대되기 때문에

아니, sizeof(long int) 바이트를 소모합니다.케이스 B에서는

, 파라미터는 예를 포인터로 구현 될 컴파일러를 가정하면, 그것은 한마디

바이트를 sizeof (POINTER_TYPE)를 소비 할 것이다 의미 하는가에 의해 참조 전달 . long&이 예상되는 곳에 short&을 전달할 수 없으므로 여기서 long&을 전달한다는 의미로 사용한다고 가정합니다.

+0

빠른 답변 주셔서 감사합니다. 조금 더 자세히 설명해 주시겠습니까? "문제의 매개 변수가 실제로 스택이 아닌 레지스터에 전달된다고 가정합니다"? – Asaf

+1

함수를 호출하는 방법은 여러 가지가 있습니다. 인수를 CPU 레지스터에 넣을 수 있습니다. 그런 다음 함수를 호출하고 그 값을 실행을 위해 남겨 둡니다. 이 경우 추가 스택 메모리가 사용되지 않습니다. – rioki

+0

@rioki - 답변 해 주셔서 감사합니다. 그러나 함수가 호출되는 방식을 결정/선택하는 방법이 있습니까? – Asaf