回答編集履歴
1
string の構造を推定
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
|
```
|