offsetof

来自cppreference.com
< cpp‎ | types
 
 
工具库
类型支持(基本类型、 RTTI 、类型特性)
动态内存管理
错误处理
程序工具
变参数函数
日期和时间
函数对象
(C++11)
关系运算符
optionalanyvariant (C++17)
pair 与 tuple
(C++11)
(C++17)
swap 、 forward 与 move
(C++14)
(C++11)
(C++11)
初等字符串转换
(C++17)
(C++17)
类型运算
(C++11)
(C++17)
 
类型支持
基本类型
基础类型
定宽整数类型 (C++11)
(C++11)
offsetof
数值极限
C 数值极限接口
运行时类型信息
类型特性
类型类别
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
类型属性
(C++11)
(C++11)
(C++11)
(C++14)
(C++11)
(C++11)(C++17 中弃用)
(C++11)
类型特性常量
元函数
(C++17)
端序
(C++20)
受支持操作
关系与属性查询
(C++11)
(C++11)
(C++11)
(C++11)
类型修改
(C++11)
(C++11)
(C++11)
类型变换
(C++11)
(C++11)
(C++17)
(C++11)(C++17 中弃用)
(C++17)
 
定义于头文件 <cstddef>
#define offsetof(type, member) /*implementation-defined*/

offsetof 展开成 std::size_t 类型的整数常量表达式,其值是从指定类型对象开始到其指定成员的字节数偏移,若有填充字节则包括之。

type 不是标准布局类型,则行为未定义。

memberstatic 成员成员函数,则行为未定义。

标准布局类型的首个成员的偏移始终是零(空基类优化是强制的)。

目录

[编辑] 异常

offsetof 不抛出异常;表达式 noexcept(offsetof(type, member)) 始终求值为 true

[编辑] 注意

offsetof 要求如上工作,即使一元 operator& 对任一涉及的类型被重载。这无法通过标准 C++ 实现,并要求编译器支持。

[编辑] 示例

#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';
}

可能的输出:

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

[编辑] 参阅

sizeof 运算符返回的无符号整数类型
(typedef) [编辑]
检查是否是一个标准布局类型
(类模板) [编辑]
offsetofC 文档