Namespaces
Variants

offsetof

cppreference.net에서
 
 
유틸리티 라이브러리
일반 유틸리티
관계 연산자 (C++20에서 폐지됨)
정수 비교 함수
(C++20)(C++20)(C++20)    
(C++20)
스왑 및 타입 연산
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
공통 어휘 타입
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
 
헤더 <cstddef>
#define offsetof(type, member) /* implementation-defined */

에 정의됨매크로 offsetof는 std::size_t 타입의 정수 상수 표현식으로 확장되며, 그 값은 지정된 타입의 객체 시작 부분에서 지정된 하위 객체까지의 오프셋(바이트 단위)이며, 패딩 비트

가 있다면 이를 포함합니다. o타입 type 이고 정적 저장 기간을 가진 객체 o.member 가 주어지면, o 는 member 의 하위 객체를 참조하는 lvalue 상수 표현식이어야 합니다. 그렇지 않으면 동작이 정의되지 않습니다. 특히, 가 정적 데이터 멤버, 비트-필드, 또는 멤버 함수

인 경우 동작은 정의되지 않습니다. type 가 PODType(C++11까지)표준-배치 타입(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