|
|
Basic types | |||||||||||||||||||||
Fixed width integer types(C++11) | |||||||||||||||||||||
Fixed width floating-point types(C++23) | |||||||||||||||||||||
| |||||||||||||||||||||
Numeric limits | |||||||||||||||||||||
C numeric limits interface | |||||||||||||||||||||
Runtime type information | |||||||||||||||||||||
|
Defined in header <cstddef> | ||
#define offsetof(type, member) /* implementation-defined */ | ||
The macrooffsetof expands to an integral constant expression of typestd::size_t, the value of which is the offset, in bytes, from the beginning of an object of specified type to its specified subobject, includingpadding bits if any.
Given an objecto of typetype
and static storage duration,o.member shall be an lvalue constant expression that refers to a subobject ofo. Otherwise, the behavior is undefined. Particularly, ifmember
is astatic data member, abit-field, or amember function, the behavior is undefined.
Iftype
is not aPODType(until C++11)standard-layout type(since C++11),the result ofoffsetof
is undefined(until C++17)use of theoffsetof
macro is conditionally-supported(since C++17).
The expressionoffsetof(type, member) is nevertype-dependent and it is value-dependent if and only iftype
is dependent.
Contents |
offsetof
throws no exceptions.
The expressionnoexcept(offsetof(type, member)) always evaluates totrue. | (since C++11) |
The offset of the first member of a standard-layout type is always zero (empty-base optimization is mandatory). | (since C++11) |
offsetof
cannot be implemented in standard C++ and requires compiler support:GCC,LLVM.
member
is not restricted to a direct member. It can denote a subobject of a given member, such as an element of an array member. This is specified byC DR 496.
It is specified in C23 that defining a new type containing an unparenthesized comma inoffsetof
is undefined behavior, and such usage is generally not supported by implementations in C++ modes:offsetof(struct Foo{int a, b;}, a) is rejected by all known implementations.
#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';}
Possible output:
offset of char m0 = 0offset of double m1 = 8offset of short m2 = 16offset of char m3 = 18
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
CWG 273 | C++98 | offsetof may not work if unaryoperator& is overloaded | required to work correctly even if operator& is overloaded |
LWG 306 | C++98 | the behavior was not specified whentype is not aPODType | the result is undefined in this case |
LWG 449 | C++98 | other requirements ofoffsetof wereremoved by the resolution ofLWG issue 306 | added them back |
unsigned integer type returned by thesizeof operator (typedef)[edit] | |
(C++11) | checks if a type is astandard-layout type (class template)[edit] |
C documentation foroffsetof |