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 优化的