offsetof
| 헤더 <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++11)
|
타입이
표준 레이아웃
타입인지 검사
(클래스 템플릿) |
|
C 문서
for
offsetof
|
|