teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

string の構造を推定

2020/07/08 04:06

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -28,4 +28,58 @@
28
28
  cout << endl;
29
29
  }
30
30
  }
31
+ ```
32
+ **追記**
33
+ 最近の gcc(64ビット) では、sizeof(std::string) は 32 です。
34
+ std::string のソースは見ていませんが、stringオブジェクトのダンプを見て、
35
+ 次のように妄想してみました。
36
+ ```C++
37
+ #include <iostream>
38
+ #include <string>
39
+ using namespace std;
40
+
41
+ struct String {
42
+ char *data;
43
+ uint64_t size;
44
+ union {
45
+ char here[16];
46
+ uint64_t capacity;
47
+ };
48
+ };
49
+
50
+ void dump(string &s)
51
+ {
52
+ cout << "size() = " << s.size() << ", capacity() = " << s.capacity()
53
+ << ", s.data() = [" << s.data() << "]\n";
54
+ String *p = reinterpret_cast<String *>(&s);
55
+
56
+ char *data;
57
+ uint64_t capacity;
58
+ if (p->size < 16) data = p->here, capacity = 15;
59
+ else data = p->data, capacity = p->capacity;
60
+ cout << "String: size = " << p->size << ", capacity = " << capacity
61
+ << ", data = [" << data << "]\n\n";
62
+ }
63
+
64
+ int main()
65
+ {
66
+ string s;
67
+ dump(s);
68
+ s = "abc";
69
+ dump(s);
70
+ s = "abcdefghijklmnopqrstuvwxyz";
71
+ dump(s);
72
+ }
73
+ ```
74
+ 実行結果
75
+ ```
76
+ size() = 0, capacity() = 15, s.data() = []
77
+ String: size = 0, capacity = 15, data = []
78
+
79
+ size() = 3, capacity() = 15, s.data() = [abc]
80
+ String: size = 3, capacity = 15, data = [abc]
81
+
82
+ size() = 26, capacity() = 30, s.data() = [abcdefghijklmnopqrstuvwxyz]
83
+ String: size = 26, capacity = 30, data = [abcdefghijklmnopqrstuvwxyz]
84
+
31
85
  ```