포인터로 패스를 사용하는 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++은 깔끔한 코드 외에 진정한 이점이 없습니다.
참고 ** ** 포인터입니다. 단지 * 모양이 다릅니다. 그래도 그 밑에있는 것은 다릅니다. (null이 될 수 없다는 점을 제외하고는) – Mehrdad
@Mehrdad 그렇다면 내 가정은 정확했다. 코드를 더 깔끔하게 만드는 것을 제외하고는 아무런 기능이 없다. – Leonardo
참조가 포인터처럼 NULL이 될 수 없기 때문에 깔끔하고 안전합니다. 그러나 참조와 포인터는 일반적으로 컴파일 될 때 동일한 기계 코드를 생성합니다. –