728x90
C++
인라인(inline) 함수
- 함수 호출의 오버헤드를 줄이기 위해, 컴파일러가 함수 호출을 실제 함수 코드로 대체하도록 제안하는 함수이다.
- C++에서 inline 키워드를 사용하여 선언한다.
- 인라인 함수는 컴파일 시점에 처리되며, 함수 호출 대신 함수의 본문을 호출 지점에 복사하여 성능을 최적화하려는 목적으로 사용된다. 따라서 컴파일러는 함수의 인라인화가 오히려 성능에 해가 된다고 판단할 경우, 이 키워드를 무시해버리기도 한다. 또한 컴파일러는 필요한 경우 일부 함수를 임의로 인라인 처리하기도 한다.
특징
- 함수 호출 오버헤드 제거
- 일반적으로 함수 호출 시, 프로그램은 스택에 매개변수와 반환 주소를 저장하고 복귀하는 오버헤드가 발생한다.
- 인라인 함수는 이러한 과정 없이, 함수의 코드를 호출 지점에 직접 삽입한다.
- 컴파일러의 선택 사항
- inline 키워드는 컴파일러에게 제안을 하는 것이며, 컴파일러가 반드시 이를 따르는 것은 아니다.
- 함수가 지나치게 크거나, 재귀 호출을 포함하는 경우 등에서는 인라인 요청을 무시할 수 있다.
- 소규모 함수에 적합
- 함수 본문이 작을수록 인라인 함수로의 변환이 효과적이다.
- 큰 함수는 복사 비용이 증가하므로, 메모리 사용량이 증가하고, 최적화에 불리해질 수 있다.
- 디버깅에 영향
- 디버깅 시, 인라인 함수는 호출이 아닌 삽입된 코드로 나타나 가독성이 떨어질 수 있다.
장점
- 성능 향상
- 함수 호출 오버헤드 제거로 속도가 빨라질 수 있다.
- 소스 코드 간소화
- 매크로(#define)보다 안전하게 사용할 수 있다.
- 컴파일 타임 최적화
- 자주 호출되는 소규모 함수에 대해 최적화를 유도한다.
단점
- 코드 크기 증가
- 함수 호출이 반복될 경우, 각 호출 지점에 함수 코드가 삽입되므로 바이너리 크기가 커질 수 있다.
- 컴파일 시간 증가
- 함수의 코드를 여러 곳에 삽입하기 때문에, 컴파일러가 더 많은 작업을 수행하게 된다.
- 디버깅 어려움
- 삽입된 코드로 인해 함수 호출 트레이스가 어렵고, 디버깅 과정에서 복잡성이 증가한다.
- 재귀 함수에는 사용 불가
- 재귀적으로 호출되는 함수는 인라인으로 처리할 수 없다.
인라인 함수가 비활성화되는 조건
- 함수의 코드 크기가 너무 큰 경우
- 함수가 재귀 호출을 포함한 경우
- 함수가 가상 함수인 경우
- 함수의 주소가 사용되는 경우
참조자(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 |