Abseil Tip 168 inline 변수

James Dennett (jdennett@google.com) 작성
최초 게시일: 2019년 9월 12일
최종 업데이트: 2020년 4월 6일

빠른 링크: abseil.io/tips/168


C++17의 inline 변수를 사용하여 헤더 파일에서 문자열 상수를 정의하는 안전한 방법은 다음과 같습니다:

inline constexpr absl::string_view kHelloWorld = "Hello World.";

이 코드에서 constexpr을 사용함으로써 초기화와 소멸의 안전성이 보장됩니다. 또한 inline 키워드를 사용하면 프로그램에서 kHelloWorld의 복사본이 단 하나만 존재하도록 보장됩니다.

처음에는 inline 키워드 사용이 다소 낯설게 느껴질 수 있습니다. 특히, inline을 주로 최적화 힌트로 생각하던 분들에게 그렇습니다. 그러나 함수에 대해 헤더에서 inline을 사용하는 것과 유사합니다. 예를 들어:

inline constexpr absl::string_view HelloWorld() {
  return "Hello World.";
}

위 함수와 비교했을 때, 변수를 사용하면 문자열이 항상 동일한 메모리 주소에 위치한다는 추가적인 장점이 있습니다.


헤더 파일에서 inline 변수 사용의 필요성

헤더 파일에서 정의되는 거의 모든 전역 변수는 inline으로 표시해야 합니다. 또한 일반적으로 constexpr로도 표시하는 것이 좋습니다. 만약 inline으로 표시하지 않으면, 해당 헤더를 포함하는 각 .cc 파일마다 별도의 변수 인스턴스가 생성됩니다. 이는 미묘하게 ODR(One Definition Rule, 단일 정의 규칙)을 위반할 수 있습니다.

헤더 파일이 아닌 곳에서는 변수를 inline으로 표시할 필요가 없습니다.


참고 사항

C++17에서는 클래스의 static constexpr 데이터 멤버가 암시적으로 inline으로 처리됩니다. 이 특별한 경우는 기존 코드의 의미를 변경하지 않으며, 더 이상 멤버에 대한 별도의 정의를 소스 파일에서 제공할 필요가 없다는 것을 의미합니다. 이는 오직 static constexpr 데이터 멤버에만 적용되며, 다른 constexpr 변수나 단순히 static const로 선언된 데이터 멤버에는 적용되지 않습니다.


참고 자료


이 번역이 도움이 되길 바랍니다! 😊