Que mágica std::string realiza quando pegamos seu endereço usando &? O endereço retornado corresponde ao endereço c_str(). Mas sabemos que c_str() é um campo em algum lugar dentro de std::string, não o endereço da instância std::string em si? Como ele faz isso?
Por exemplo, neste código, ele imprime "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()
(estd::string::data()
) retorna um ponteiro para o buffer de caracteres atual da string, onde quer que ele esteja na memória.A única maneira de o ponteiro ser igual ao endereço do
std::string
próprio objeto é se astd::string
implementação suportar Otimização de String Curta (ou seja, dados de caracteres de comprimento muito curto são armazenados diretamente nostring
próprio objeto, em vez de em outro lugar na memória dinâmica) e o buffer SSO for o primeiro membro de dados destd::string
. C++ garante que o primeiro membro de dados de um objeto esteja no mesmo endereço que o próprio objeto.Mas, não há garantia de que o buffer SSO (se existir) seja o 1º membro de dados. Então, não confie nesse comportamento.