본문 바로가기

Dev Language/C++10

함수 오버로딩 함수 오버로딩 C++은 오버로딩 된 함수들 중 어느 것이 어느 것인지 어떻게 추적할까? C++은 각각의 함수들에 비밀 증명을 발급한다. 프로그램을 작성하여 컴파일하기 위해 C++ 개발 도구의 편집기를 사용하면, C++ 컴파일러는 사용자를 대신하여 이름 장식 또는 이름 맹글링(NAME MANGLING)이라는 마술을 부린다. 그것은 함수 원형에 지정되어 있는 형식 매개변수의 데이터 형을 기반으로 각각의 함 수 이름을 암호화하는 것이다. 예를 들어 long MyFunctionFoo(int, float); 이라는 이름 장식이 되어있지 않은 함수 원형이 있다면, 컴파일러는 스스로의 용도를 위해 이 형식을 ?MyFunctionFoo@@YAXH@Z 라고 내부 형식으로 변환한다. 이렇게 겉보기 장식을 통해 매개변수의 .. 2016. 12. 6.
배열과 포인터 배열 중요한 것은, 배열을 선언하면 내부적으로 포인터와 동일하게 작동한다는 것이다. 그래서 포인터 표기 *과 배열 표기[]는 거의 동일하게 사용할 수 있다. 예를 들어 int pt[3] = { 0 }; 으로 선언하면 pt[0] 과 *pt는 같은 값이다. pt[1]과 *(pt+1)은 같은 값이다. - 일반 변수를 함수의 매개변수로 사용하면 함수는 전달된 값의 복사본을 갖고 작업을 한다. 하지만 배열을 매개변수로 전달하면, 배열의 복사본을 생성하여 작업을 하는 것이 아니라 배열의 주소, 즉 포인터를 전달하여 배열의 원본을 가지고 작업한다. - 배열의 주소를 매개변수로 사용하는 것은 전체 배열을 복사하는 것보다 시간과 메모리를 절약한다. 복사본을 사용하는 것은 배열이 클 경우에는 부담이 된다. 반면 원본을 대.. 2016. 12. 5.
함수 원형이 필요한 이유 함수 원형이 필요한 이유 함수 원형은 컴파일러에게 함수의 인터페이스를 알려준다. 예를 들어 double cube(double x); 라는 함수 원형이 있고, main 안에서 double volume = cube(side); 로 선언이 되어있을 때, 1) 함수 원형은 cube()가 하나의 double형 매개변수를 가진다는 사실을 컴파일러에게 알려준다. 따라서 프로그램이 cube()에 매개변수를 제공하는 데 실패하면, 컴파일러는 함수 원형에 근거하여 에러를 검출한다. 2) cube()함수는 계산을 끝냈을 때 리턴 값을 (CPU의 레지스터나 메모리의) 어떤 지정된 위치에 넣는다. 그러면 호출한 함수(여기서는 main)가 그 위치에서 값을 꺼내온다. cube()가 double형 이라는 사실을 함수 원형이 컴파일.. 2016. 12. 5.
스택에 저장되는 값 (자료 백업) 출처 http://www.google.co.kr/url?sa=t&rct=j&q=&esrc=s&frm=1&source=web&cd=5&ved=0ahUKEwixxtCA18zQAhUIxbwKHc5IDUcQFgg6MAQ&url=http%3A%2F%2Fwww.hackerschool.org%2FSub_Html%2FHS_University%2FBOF%2Fessential%2FPDF_Files%2F17.pdf&usg=AFQjCNEU5mfSXIeMZA3ldxXw7N1FmqPlxA&sig2=wAM2av4f4lPMbsyJLNS4nA&bvm=bv.139782543,d.dGc&cad=rjt 2016. 11. 29.