name mangling, 함수이름과 주소 확인하기 _240726 추가.

보물창고·2022년 2월 27일
0

name mangling 이란?

  • 같은 이름의 함수를 만들었으나, 컴파일 단계에서는 매개변수나 반환형 타입에 따라 함수의 이름을 따로 만들어주는 것을 말함.

왜 이러한 것이 사용되는걸까? 240726

: c++의 경우 함수를 중복정의가 가능하다.
어셈블러에서 중복정의를 구분하기 위해서 사용된다.

-> 어셈블러에서도 중복정의를 기계어로 구분짓지 않으면 모호성 발생하지 않을까?

  • 추가적으로 함수의 시그니처 중 반환타입은 사용되지 않고,
  • 중복정의할 때도 반환값이 포함되지 않는 이유에 대해서.
    이유는 fundamental c++ p.474에 있다.
    즉, 함수를 호출할때 반드시 함수 호출결과를 받아야만 하는 것은 아니기 때문이다.
    double func() {};
    int func() {};

main
{
func(); // 반환 타입 안받고 호출하자. 이렇게 해도 됨.
}

정의와 언제 사용됨?

1) 컴파일러가 컴파일 시간에 심볼의 이름을 변경하는 현상
-> 어셈블러로 변경할 때 오버로딩 함수가 다르게 만들어진것을 확인할 수 있음.

2) 함수 오버로딩, namespace, template 등의 문법.

c++ 버전에서의 어셈블러 확인하기.

  • 아래의 코드를 어셈블러로 확인해보자.
  • 어셈블러 확인하기
    : 명령프롬프트 사용하기, 벨로그에 있음.
  • 결과 : 호출되는 함수의 이름이 다름을 확인할 수 있음.
    YAHH, YANN

g++ 버전에서의 어셈블러 확인하기

  • 명령 프롬프트 작성하기

    g++ test2.cpp -S
    notepad test2.s

  • 결과 : int형은 squarei로 , double형은 squared로
    nameMangling이 되는 모습을 확인할 수 있음.


함수 이름과 함수 주소

  • c++에서는 오버로딩에 의해 동일한 함수명이지만,
    여러가지 인자로 구성된 함수를 만들 수 있음.

  • but, 모호성이 발생할 수 있다는 사실을 인지해야 함.

  • 결과
    • -> &square를 출력하는 부분이 이에 해당함.
      2개의 함수가 있지만, 어떤 함수의 주소인지 모호한 문제가 발생함.

함수 포인터를 이용해 함수 참조하기

: f2 의 경우, 암시적형변환이 발생한 것임.
:: 함수 포인터 타입과 함수 타입을 작성했는데, 둘은 다른 타입임.

  • 여태껏 함수의 이름으로 &연산자 없이 함수포인터를 설정했지만, 그것을 암시적인 것임.

  • typeid를 이용해 함수 포인터 와 함수 형식 이 다르게 출력됨을 확인할 수 있음.


함수 찾는 순서

: basic 강의 참고.

  1. 동일한 형식에 맞춰서
  2. template 형식에 따름
  3. 크기는 다르지만, 동일한 형 타입
    예를 들면 float 이면 -> double을 따름
  4. 기본 형식을 따름.
    float이지만, 유저형식과 int가 있다면 int를 따름.
  5. 유저형식
  6. 가변 인자.
profile
🔥🔥🔥

0개의 댓글