2013-02-26 3 views
2

포인터로 패스를 사용하는 C++에서이 스왑 함수의 간단한 테스트를 고려하십시오.C가 포인터없이 주소/참조를 통해 전달하지 않는 이유는 무엇입니까?

#include <iostream> 

using std::cout; 
using std::endl; 

void swap_ints(int *a, int *b) 
{ 
    int temp = *a; 
    *a = *b; 
    *b = temp; 
    return; 
} 

int main(void) 
{ 
    int a = 1; 
    int b = 0; 
    cout << "a = " << a << "\t" << "b = " << b << "\n\n"; 
    swap_ints(&a, &b); 
    cout << "a = " << a << "\t" << "b = " << b << endl; 

    return 0; 
} 

이 프로그램은 주소를 통과 한 것보다 많은 메모리를 사용합니까? 이와 함수 decleration 같이 :

void swap_ints(int &a, int &b) 
{ 
    int temp = a; 
    a = b; 
    b = temp; 
    return; 
} 

는 C++ 기능이 통과하여 참조 버전은 포인터 변수를 생성하기 위해 필요로하지 않음으로써,보다 적은 메모리를 사용합니까?

C는 C++과 동일한 "통과 기준"기능을 가지고 있지 않습니까? 그렇다면 더 많은 메모리 효율적인 코드를 의미하기 때문에 왜 안됩니까? 그렇지 않다면, C가이 능력을 채택하지 않는다는 뒤에있는 함정은 무엇인가? 내가 생각하지 않는 것은 C++이 아마도이 기능을 구현하기위한 포인터를 생성한다는 사실입니다. 이것은 컴파일러가 실제로하는 일입니다. 그래서 C++은 깔끔한 코드 외에 진정한 이점이 없습니다.

+6

참고 ** ** 포인터입니다. 단지 * 모양이 다릅니다. 그래도 그 밑에있는 것은 다릅니다. (null이 될 수 없다는 점을 제외하고는) – Mehrdad

+0

@Mehrdad 그렇다면 내 가정은 정확했다. 코드를 더 깔끔하게 만드는 것을 제외하고는 아무런 기능이 없다. – Leonardo

+3

참조가 포인터처럼 NULL이 될 수 없기 때문에 깔끔하고 안전합니다. 그러나 참조와 포인터는 일반적으로 컴파일 될 때 동일한 기계 코드를 생성합니다. –

답변

1

유일한 방법은 컴파일러가 생성 한 코드를 검사하고 두 코드를 비교하여 얻을 수있는 것을 확인하는 것입니다.

그렇긴해도 적어도 합리적인 주류 컴파일러의 경우에는 (적어도 최적화가 활성화되었을 때) 실제로 차이점을 보게되면 조금 놀랄 것입니다. 지난 10 년 간 업데이트되지 않은 아주 작은 임베디드 시스템에서 컴파일러와의 차이점을 확인해보십시오.하지만 거기에서도 정직하게는있을 법하지 않습니다.

필자는 대부분의 경우 인라인 생성 된 간단한 함수 코드를 볼 것으로 예상하므로 함수 호출이나 매개 변수 전달이 전혀 필요하지 않습니다. 전형적인 경우에는 두 가지 이상의로드 및 저장에 그칠 가능성이 큽니다.

1

코드의 계수 변수와 프로세서에서 사용하는 계산 메모리를 혼동하지 마십시오. C++은 컴파일러의 내부 동작을 숨겨주는 많은 추상화를 통해 인간이 더 쉽고 쉽게 따라 할 수 있도록합니다.

의도적으로 C에는 C++과 같은 수준의 추상화 수준이 없습니다.