| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- parameter
- Gradient
- Class
- UNO
- Read
- Pointer
- digitalRead
- wpf
- flutter
- Filtering
- public
- compare
- Gaussian
- Contour
- memory
- edge
- Android
- c++
- atmega328
- sensor
- SERIAL
- mfc
- aduino
- file access
- Binary
- subpixel
- stream
- Unity
- Encapusulation
- APP
Archives
- Today
- Total
폴크(FOLC)
inline function / static function 본문
728x90
반응형
inline 키워드는 함수를 호출하는 대신 컴파일 시점에 해당 함수의 본문을 코드에 직접 삽입하도록 컴파일러에 요청하는 것입니다.
inline int add(int a, int b)
{
return a + b;
}
목적
- 함수 호출 오버헤드 제거 → 성능 향상
- 헤더 파일에 함수 정의를 포함할 수 있게 함 → 링크 오류 방지
특징
- 함수 정의는 헤더 파일에 위치해야 함
- inline은 컴파일러에 대한 요청이지 강제는 아님
- 여러 번 정의되어도 ODR(One Definition Rule)을 위반하지 않음
핵심
- inline은 성능 최적화를 위한 힌트로, 스레드 안전성과는 직접적 연관이 없습니다.
- 멀티스레드 환경에서 inline 함수를 사용해도, 내부에 스레드 비안전한 코드(예: 전역 변수 접근)가 있다면 여전히 문제가 발생합니다.
- 해결법: std::mutex 또는 std::atomic 사용
static 함수는 선언된 소스 파일(.cpp) 내부에서만 사용 가능한 함수를 의미합니다. 다른 파일에서 참조할 수 없습니다.
cpp
복사편집
static int multiply(int a, int b)
{
return a * b;
}
목적
- 함수나 전역 변수의 링크 범위를 현재 소스 파일로 제한
- 심볼 이름 충돌 방지 (특히 라이브러리 작성 시 유용)
특징
- **파일 범위(local linkage)**를 가짐
- 헤더 파일이 아닌 소스 파일에 정의해야 함
- 컴파일러가 인라인 최적화를 더 자유롭게 할 수 있음 (외부에 노출되지 않으므로)
핵심
- static 함수는 링크 범위(translation unit scope) 를 제한하는 역할일 뿐, 스레드 동기화와는 무관합니다.
- 하지만 내부에 static 지역 변수가 포함되어 있다면, 멀티스레드와 관련된 중요한 이슈가 발생할 수 있습니다.
C++11 이후
- 정적 지역 변수의 초기화는 thread-safe 합니다. (C++11 표준 보장)
- 그러나 값에 대한 읽기/쓰기 연산은 여전히 스레드 안전하지 않습니다 → 데이터 레이스 발생 가능
inline / static vs 멀티스레딩
| inline | 컴파일러에 인라인 최적화 요청 | 직접 영향 없음 | 내부 코드가 스레드 안전해야 함 |
| static 함수 | 현재 소스 파일 내에서만 접근 가능 | 직접 영향 없음 | 파일 단위 격리는 가능 |
| static 변수 | 정적 저장 기간, 단 한 번 초기화 | 초기화는 thread-safe (C++11 이상) 연산은 안전하지 않음 |
atomic 또는 mutex 필요 |
728x90
반응형
사업자 정보 표시
사업자 등록번호 : -- | TEL : --