# offsetof

From cppreference.com
< cpp‎ | types

Defined in header `<cstddef>` |  |
#define offsetof(type, member) /*implementation-defined*/ |  |

The macro offsetof expands to an integral constant expression of type std::size_t, the value of which is the offset, in bytes, from the beginning of an object of specified type to its specified member, including padding if any.

If `type` is not a standard layout type, the behavior is undefined (until C++17)use of the `offsetof` macro is conditionally-supported (since C++17).

If `member` is a static member or a member function, the behavior is undefined.

The offset of the first member of a standard-layout type is always zero (empty-base optimization is mandatory).

The expression `offsetof(type, member)` is never type-dependent and it is value-dependent if and only if type is dependent.

### Exceptions

`offsetof` throws no exceptions; the expression noexcept(offsetof(type, member)) always evaluates to true.

### Notes

`offsetof` cannot be implemented in standard C++ and requires compiler support: GCC, LLVM

### Example

Run this code

    #include <iostream>
    #include <cstddef>
    struct S {
        char c;
        double d;
    };
    int main()
    {
        std::cout << "the first element is at offset " << offsetof(S, c) << '\n'
                  << "the double is at offset " << offsetof(S, d) << '\n';
    }

Possible output:

    the first element is at offset 0
    the double is at offset 8

### See also

size_t | unsigned integer type returned by the `sizeof` operator (typedef)
is_standard_layout (C++11) | checks if a type is a standard-layout type (class template)

Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/types/offsetof&oldid=110517"