C++クラスメモリレイアウト2
1458 ワード
注意:g++のみで実験は以下の結果です!1 lさんが間違いを指摘してくれてありがとう.stringオブジェクトの大きさはどれくらいですか?
sizeofで取ると4バイトになるので、定義が似ているのではないかと思います.
class string {
……
private:
char *pStr;
};
もちろんソースコードがもっとはっきり見えるかもしれませんが、どう見たらいいか分かりません.例を書いてみましょう
出力を見てみましょう.
$ ./a.out
4 4
helloworld
helloworld
hilloworld
最初の行の出力からstring自体の文字列がどんなに大きくてもsizeofが取るサイズは4であることがわかる.
2行目はstrを格納するアドレスからpStrを自分の理解で取り出し、string文字列の値であることを見てみましょう.
3行目出力pStr
4行目はpStrを修正してstrに影響があるかどうかを見て、答えはあります.
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に影響があるかどうかを見て、答えはあります.