Namespaces
Variants

offsetof

From cppreference.net
Utilities library
헤더 파일에 정의됨 <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 문서 for offsetof