author | Stefan Teleman <stefan.teleman@oracle.com> |
Wed, 16 Dec 2015 20:20:50 -0800 | |
changeset 5205 | eaff9ab86216 |
permissions | -rw-r--r-- |
5205
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
1 |
# Stefan Teleman <[email protected]> |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
2 |
# 1. Clearer cast not relying on array index -1. |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
3 |
# 2. Optimization based on initial std::string size and capacity. |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
4 |
# Internal patch. Not submitted upstream yet. |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
5 |
--- libstdc++-v3/include/bits/basic_string.h 2015-05-28 12:27:46.000000000 -0400 |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
6 |
+++ libstdc++-v3/include/bits/basic_string.h 2015-09-14 01:16:05.666069507 -0400 |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
7 |
@@ -131,6 +131,15 @@ |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
8 |
typedef std::reverse_iterator<iterator> reverse_iterator; |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
9 |
|
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
10 |
private: |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
11 |
+ // Use empty-base optimization: http://www.cantrip.org/emptyopt.html |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
12 |
+ struct _Alloc_hider : _Alloc |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
13 |
+ { |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
14 |
+ _Alloc_hider(_CharT* __dat, const _Alloc& __a) _GLIBCXX_NOEXCEPT |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
15 |
+ : _Alloc(__a), _M_p(__dat) { } |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
16 |
+ |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
17 |
+ _CharT* _M_p; // The actual data. |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
18 |
+ }; |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
19 |
+ |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
20 |
// _Rep: string representation |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
21 |
// Invariants: |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
22 |
// 1. String really contains _M_length + 1 characters: due to 21.3.4 |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
23 |
@@ -268,15 +277,6 @@ |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
24 |
_M_clone(const _Alloc&, size_type __res = 0); |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
25 |
}; |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
26 |
|
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
27 |
- // Use empty-base optimization: http://www.cantrip.org/emptyopt.html |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
28 |
- struct _Alloc_hider : _Alloc |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
29 |
- { |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
30 |
- _Alloc_hider(_CharT* __dat, const _Alloc& __a) _GLIBCXX_NOEXCEPT |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
31 |
- : _Alloc(__a), _M_p(__dat) { } |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
32 |
- |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
33 |
- _CharT* _M_p; // The actual data. |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
34 |
- }; |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
35 |
- |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
36 |
public: |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
37 |
// Data Members (public): |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
38 |
// NB: This is an unsigned type, and thus represents the maximum |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
39 |
@@ -298,7 +298,10 @@ |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
40 |
|
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
41 |
_Rep* |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
42 |
_M_rep() const _GLIBCXX_NOEXCEPT |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
43 |
- { return &((reinterpret_cast<_Rep*> (_M_data()))[-1]); } |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
44 |
+ { |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
45 |
+ _Rep* __r = static_cast<_Rep*>(reinterpret_cast<void*>(_M_data())); |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
46 |
+ return --__r; |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
47 |
+ } |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
48 |
|
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
49 |
// For the internal use we have functions similar to `begin'/`end' |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
50 |
// but they do not call _M_leak. |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
51 |
--- libstdc++-v3/include/bits/basic_string.tcc 2014-01-02 17:30:10.000000000 -0500 |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
52 |
+++ libstdc++-v3/include/bits/basic_string.tcc 2015-09-14 01:16:09.408163359 -0400 |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
53 |
@@ -575,7 +575,8 @@ |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
54 |
// malloc implementations that allocate memory blocks rounded up |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
55 |
// to a size which is a power of 2). |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
56 |
const size_type __pagesize = 4096; |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
57 |
- const size_type __malloc_header_size = 4 * sizeof(void*); |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
58 |
+ const size_type __min_capacity = 32; |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
59 |
+ const size_type __malloc_header_size = 8 * sizeof(void*); |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
60 |
|
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
61 |
// The below implements an exponential growth policy, necessary to |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
62 |
// meet amortized linear time requirements of the library: see |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
63 |
@@ -586,6 +587,9 @@ |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
64 |
if (__capacity > __old_capacity && __capacity < 2 * __old_capacity) |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
65 |
__capacity = 2 * __old_capacity; |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
66 |
|
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
67 |
+ if (__capacity < __min_capacity) |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
68 |
+ __capacity = __min_capacity; |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
69 |
+ |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
70 |
// NB: Need an array of char_type[__capacity], plus a terminating |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
71 |
// null char_type() element, plus enough for the _Rep data structure. |
eaff9ab86216
21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
72 |
// Whew. Seemingly so needy, yet so elemental. |