C++クラスメモリレイアウト2

1458 ワード

注意:g++のみで実験は以下の結果です!1 lさんが間違いを指摘してくれてありがとう.stringオブジェクトの大きさはどれくらいですか?
sizeofで取ると4バイトになるので、定義が似ているのではないかと思います.
class string {
……
private:
char *pStr;
};
もちろんソースコードがもっとはっきり見えるかもしれませんが、どう見たらいいか分かりません.例を書いてみましょう
#include <stdio.h>

#include <iostream>

#include <string>

int main()

{

std::string str = "helloworld";

std::string str1 = "hello";

printf("%d %d
"
,sizeof(str),sizeof(str1));

char *pStringMemberData = *(char**)&str;

printf("%s
"
,pStringMemberData);

do {

printf("%c",*pStringMemberData);

} while (*pStringMemberData++!='\0');

(*(char**)&str)[1] = 'i';

std::cout << std::endl << str << std::endl;

return 0;

}


出力を見てみましょう.
$ ./a.out
4 4
helloworld
helloworld
hilloworld
最初の行の出力からstring自体の文字列がどんなに大きくてもsizeofが取るサイズは4であることがわかる.
2行目はstrを格納するアドレスからpStrを自分の理解で取り出し、string文字列の値であることを見てみましょう.
3行目出力pStr
4行目はpStrを修正してstrに影響があるかどうかを見て、答えはあります.