Study/TIL(Today I Learned)

24.11.24 C++

에린_1 2024. 11. 24. 23:23
728x90

C++

인라인(inline) 함수

  • 함수 호출의 오버헤드를 줄이기 위해, 컴파일러가 함수 호출을 실제 함수 코드로 대체하도록 제안하는 함수이다.
  • C++에서 inline 키워드를 사용하여 선언한다.
  • 인라인 함수는 컴파일 시점에 처리되며, 함수 호출 대신 함수의 본문을 호출 지점에 복사하여 성능을 최적화하려는 목적으로 사용된다. 따라서 컴파일러는 함수의 인라인화가 오히려 성능에 해가 된다고 판단할 경우, 이 키워드를 무시해버리기도 한다. 또한 컴파일러는 필요한 경우 일부 함수를 임의로 인라인 처리하기도 한다.

특징

  1. 함수 호출 오버헤드 제거
    • 일반적으로 함수 호출 시, 프로그램은 스택에 매개변수와 반환 주소를 저장하고 복귀하는 오버헤드가 발생한다.
    • 인라인 함수는 이러한 과정 없이, 함수의 코드를 호출 지점에 직접 삽입한다.
  2. 컴파일러의 선택 사항
    • inline 키워드는 컴파일러에게 제안을 하는 것이며, 컴파일러가 반드시 이를 따르는 것은 아니다.
    • 함수가 지나치게 크거나, 재귀 호출을 포함하는 경우 등에서는 인라인 요청을 무시할 수 있다.
  3. 소규모 함수에 적합
    • 함수 본문이 작을수록 인라인 함수로의 변환이 효과적이다.
    • 큰 함수는 복사 비용이 증가하므로, 메모리 사용량이 증가하고, 최적화에 불리해질 수 있다.
  4. 디버깅에 영향
    • 디버깅 시, 인라인 함수는 호출이 아닌 삽입된 코드로 나타나 가독성이 떨어질 수 있다.

장점

  1. 성능 향상
    • 함수 호출 오버헤드 제거로 속도가 빨라질 수 있다.
  2. 소스 코드 간소화
    • 매크로(#define)보다 안전하게 사용할 수 있다.
  3. 컴파일 타임 최적화
    • 자주 호출되는 소규모 함수에 대해 최적화를 유도한다.

단점

  1. 코드 크기 증가
    • 함수 호출이 반복될 경우, 각 호출 지점에 함수 코드가 삽입되므로 바이너리 크기가 커질 수 있다.
  2. 컴파일 시간 증가
    • 함수의 코드를 여러 곳에 삽입하기 때문에, 컴파일러가 더 많은 작업을 수행하게 된다.
  3. 디버깅 어려움
    • 삽입된 코드로 인해 함수 호출 트레이스가 어렵고, 디버깅 과정에서 복잡성이 증가한다.
  4. 재귀 함수에는 사용 불가
    • 재귀적으로 호출되는 함수는 인라인으로 처리할 수 없다.

인라인 함수가 비활성화되는 조건

  1. 함수의 코드 크기가 너무 큰 경우
  2. 함수가 재귀 호출을 포함한 경우
  3. 함수가 가상 함수인 경우
  4. 함수의 주소가 사용되는 경우

참조자(Reference)

  • 이미 선언된 변수의 앞에 & 연산자가 오면 주소 값의 반환을 명령하는 뜻이 되지만, 새로 선언되는 변수의 이름 앞에 등장하면, 이는 참조자의 선언을 뜻하는 게 된다.
  • 참조자는 자신이 참조하는 변수를 대신할 수 있는 또 하나의 이름이다.
  • 함수 내에서 선언된 지역적(local) 참조자는 지역변수와 마찬가지로 함수를 빠져나가면 소멸이 된다.
  • 참조자 수에는 제한이 없다. 한 개의 변수에 여러 개의 참조자를 선언하는 것도 가능하다.

참조자의 선언 가능 범위

  • 참조는 변수에 대해서만 선언이 가능하고, 선언됨과 동시에 누군가를 참조해야 한다.
  • 상수를 대상으로 참조자를 선언할 수는 없고, 미리 참조자를 선언했다가, 후에 누군가를 참조하는 것은 불가능하며, 참조의 대상을 바꾸는 것도 불가능하다.

참조자가 상수를 참조하는 법

  • 프로그램상에서 표현되는 숫자를 가리켜 리터럴(literal) 또는 리터럴 상수(literal constant)라 한다. 이들은 암시적으로 존재하는 값이며 다음 행으로 넘어가면 존재하지 않는 상수이다. 그러기 때문에 참조할 수 없다.
      const int &ref = 30;
  • c++에서는 위와 같은 문장이 성립하도록, const 참조자를 이용해서 상수를 참조할 때 임시변수라는 것을 만든다. 임시로 생성한 변수를 상수화하여 이를 참조자가 참조하게끔 하는 구조이니, 결과적으로는 상수화된 변수를 참조하는 형태가 된다.

구조체(Struct)

  • 구조체는 연관 있는 데이터를 묶을 수 있는 문법적 장치로 데이터의 표현에 매우 큰 도움을 준다.
  • 키워드 struct는 이어서 선언되는 자료형이 구조체를 기반으로 정의된 자료형임을 나타낸다. 그리고 키워드 struct를 생략하려면 별도의 typedef 선언을 추가해야 한다. 하지만 C++에서는 기본 자료형 변수의 선언방식이나 구조체를 기반으로 정의된 자료형의 변수 선언방식에 차이가 없다. 즉 C++에서는 별도의 typedef 선언 없이도 다음과 같이 변수를 선언할 수 있다.
  • C++에서 구조체는 클래스의 일종으로 간주된다.

구조체 함수

  • 구조체 안에 함수가 정의되어 있으면 함수를 인라인으로 처리하라는 의미가 더불어 내포된다.
  • 반면 함수를 구조체 밖으로 빼내면(함수 자체는 내부, 구현을 외부), 이러한 의미가 사라진다. 따라서 인라인의 의미를 그대로 유지하려면 다음과 같이 키워드 inline을 이용해서 인라인 처리를 명시적으로 지시해야 한다.
728x90

'Study > TIL(Today I Learned)' 카테고리의 다른 글

24.11.26 C++, 책  (0) 2024.11.26
24.11.25 CS, C++  (0) 2024.11.25
24.11.23 C++  (0) 2024.11.23
24.11.22 JavaScript, C++  (0) 2024.11.22
24.11.21 Node.js, Unity  (0) 2024.11.21