offsetof
|
헤더 파일에 정의됨
<cstddef>
|
||
|
#define offsetof(type, member) /* implementation-defined */
|
||
매크로 offsetof 는 std::size_t 타입의 정수형 상수 표현식으로 확장되며, 그 값은 지정된 타입의 객체 시작 지점부터 해당 객체의 지정된 하위 객체까지의 바이트 단위 오프셋으로, 패딩 비트 가 있는 경우 이를 포함합니다.
정적 저장 기간을 가진
type
타입의 객체
o
가 주어졌을 때,
o.
member
는
o
의 하위 객체를 참조하는 좌측값 상수 표현식이어야 합니다. 그렇지 않으면 동작은 정의되지 않습니다. 특히,
member
가
정적 데이터 멤버
,
비트 필드
, 또는
멤버 함수
인 경우 동작은 정의되지 않습니다.
만약
type
이
PODType
(C++11 이전)
standard-layout
type
(C++11 이후)
가 아니라면,
offsetof
의 결과는 정의되지 않음
(C++17 이전)
offsetof
매크로의 사용은 조건부 지원됨
(C++17 이후)
.
표현식
offsetof
(
type, member
)
는 절대
타입 의존적
이지 않으며, 오직
type
이 의존적일 때에만 값 의존적입니다.
목차 |
예외
offsetof
는 예외를 발생시키지 않습니다.
|
noexcept ( offsetof ( type, member ) ) 표현식은 항상 true 로 평가됩니다. |
(C++11부터) |
참고 사항
|
표준 레이아웃 타입의 첫 번째 멤버 오프셋은 항상 0입니다 ( empty-base optimization 이 필수입니다). |
(since C++11) |
offsetof
는 표준 C++로 구현할 수 없으며 컴파일러 지원이 필요합니다:
GCC
,
LLVM
.
member
는 직접 멤버로만 제한되지 않습니다. 이는 배열 멤버의 요소와 같이 주어진 멤버의 하위 객체를 나타낼 수 있습니다. 이는
C DR 496
에서 명시됩니다.
C23에서 괄호 없이 쉼표를 포함하는 새로운 타입을 정의하는 것은
offsetof
에서 정의되지 않은 동작으로 명시되며, 이러한 사용법은 일반적으로 C++ 모드에서 구현체들에 의해 지원되지 않습니다:
offsetof
(
struct
Foo
{
int
a, b
;
}
, a
)
는 알려진 모든 구현체에서 거부됩니다.
예제
#include <cstddef> #include <iostream> struct S { char m0; double m1; short m2; char m3; // private: int z; // warning: 'S' is a non-standard-layout type }; int main() { std::cout << "offset of char m0 = " << offsetof(S, m0) << '\n' << "offset of double m1 = " << offsetof(S, m1) << '\n' << "offset of short m2 = " << offsetof(S, m2) << '\n' << "offset of char m3 = " << offsetof(S, m3) << '\n'; }
가능한 출력:
offset of char m0 = 0 offset of double m1 = 8 offset of short m2 = 16 offset of char m3 = 18
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| CWG 273 | C++98 |
offsetof
가 단항
operator&
가 오버로드된 경우 작동하지 않을 수 있음
|
operator&
가 오버로드된 경우에도
정상적으로 작동하도록 요구됨 |
| LWG 306 | C++98 |
type
이
PODType
가 아닐 때의 동작이 명시되지 않음
|
이 경우 결과는 정의되지 않음 |
| LWG 449 | C++98 |
offsetof
의 다른 요구사항들이
LWG issue 306 의 해결로 인해 제거됨 |
해당 요구사항들을 다시 추가함 |
참고 항목
|
sizeof
연산자가 반환하는 부호 없는 정수형
(typedef) |
|
|
(C++11)
|
타입이
표준 레이아웃
타입인지 검사
(클래스 템플릿) |
|
C 문서
for
offsetof
|
|