当我们使用 & 获取 std::string 的地址时,它会执行什么魔法?返回的地址与 c_str() 地址匹配。但我们知道 c_str() 是 std::string 内部某个字段,而不是 std::string 实例本身的地址?它是如何做到的?
例如在此代码中,它打印“Equal”:
#include <string>
#include <iostream>
int main(int argc, char const *argv[])
{
std::string s = "Hello, World!";
auto addr = &s;
auto addr2 = s.c_str();
std::cout << std::hex << addr << std::endl;
std::cout << std::hex << reinterpret_cast<const void*>(addr2) << std::endl;
if ((void*)addr == (void*)addr2) {
std::cout << "Equal" << std::endl;
} else {
std::cout << "Not equal" << std::endl;
}
return 0;
}
std::string::c_str()
(和std::string::data()
)返回指向字符串当前字符缓冲区的指针,无论它位于内存中的哪个位置。指针等于对象本身地址的唯一方法
std::string
是,如果std::string
实现支持短字符串优化(即,非常短的字符数据直接存储在string
对象本身中,而不是动态内存中的其他地方),并且 SSO 缓冲区是 的第一个数据成员std::string
。C++ 保证对象的第一个数据成员与对象本身位于同一地址。但是,不能保证 SSO 缓冲区(如果存在)是第一个数据成员。因此,不要依赖此行为。