small buffer optimization
当对象的大小不固定时类似 vector 这种对象,当对象的大小很小时可能并不需要动态分布内存,我们可以直接存储在对象体里面。
当字符串很小时我们就不需要额外分配内存去存储,我们可以利用 ptr 这个变量的空间去存储。
class String {public:char* ptr;size_t length;size_t capacity;explicit String(const char* str) {length = strlen(str);capacity = length + 1;ptr = new char[length + 1];strcpy(ptr, str);}};int main() {String s1("Hello");String s2("a");return 0;}
class String {public:union {char* ptr;char data[sizeof(char*)];} storage;char* ptr;size_t length;size_t capacity;explicit String(const char* str) {size_t len = strlen(str);if (len + 1 <= sizeof(storage)) {length = len;strcpy(storage.data, str);capacity = -1;} else {storage.ptr = new char[len + 1];strcpy(storage.ptr, str);capacity = len + 1;}}const char* c_str() const {if (capacity == -1) {return storage.data;} else {return storage.ptr;}}~String() {if (capacity != -1) {delete[] storage.ptr;}}};int main() {String s1("Hello111111111");String s2("a");std::clog << &s1 << '\t' << (void *) s1.c_str() << std::endl;std::clog << &s2 << '\t' << (void *) s2.c_str() << std::endl;return 0;}
标准库的字符串也是使用 SBO 优化的
