C++之获取内存地址std::addressof

📅 2026/7/8 2:08:09 👁️ 阅读次数 📝 编程学习
C++之获取内存地址std::addressof

std::addressof的核心功能是绕过可能被重载的一元&运算符,直接获取对象在内存中的真实起始地址。即使目标类重载了operator&使其返回非指针类型或代理对象,该函数仍能可靠返回对象的实际内存位置。以下是详细解析:

功能本质

解决重载operator&的干扰

  • 普通&运算符的局限性:若类重载了operator&(例如返回自定义代理对象、其他标量类型或抛出异常),直接使用&obj会调用用户自定义的重载版本,导致无法获取真实的内存物理地址。
  • std::addressof通过底层机制强制绕过用户自定义的重载逻辑,确保返回对象内存布局的第一个字节的地址,消除了来自用户侧定制行为的副作用。

与普通取址操作的关键区别

  • &obj:属于语言级运算符。可能调用类的重载operator&,其返回类型和语义由类定义决定(甚至可能不是指针类型)。
  • std::addressof(obj):属于标准库级工具函数。始终返回对象的真实内存地址,其返回类型严格为T*(并完美保留原对象的constvolatile限定符)。

实现原理

基于核心类型转换的传统实现

在 C++17 之前,标准库为了在纯 C++ 语言层面规避operator&的重载干扰,通常采用多层强制类型转换的方式来实现。其典型逻辑如下:

template<classT>T*addressof(T&arg)noexcept{returnreinterpret_cast<T*>(&const_cast