small buffer optimization

当对象的大小不固定时类似 vector 这种对象,当对象的大小很小时可能并不需要动态分布内存,我们可以直接存储在对象体里面。

当字符串很小时我们就不需要额外分配内存去存储,我们可以利用 ptr 这个变量的空间去存储。

  1. class String {
  2. public:
  3. char* ptr;
  4. size_t length;
  5. size_t capacity;
  6. explicit String(const char* str) {
  7. length = strlen(str);
  8. capacity = length + 1;
  9. ptr = new char[length + 1];
  10. strcpy(ptr, str);
  11. }
  12. };
  13. int main() {
  14. String s1("Hello");
  15. String s2("a");
  16. return 0;
  17. }
  1. class String {
  2. public:
  3. union {
  4. char* ptr;
  5. char data[sizeof(char*)];
  6. } storage;
  7. char* ptr;
  8. size_t length;
  9. size_t capacity;
  10. explicit String(const char* str) {
  11. size_t len = strlen(str);
  12. if (len + 1 <= sizeof(storage)) {
  13. length = len;
  14. strcpy(storage.data, str);
  15. capacity = -1;
  16. } else {
  17. storage.ptr = new char[len + 1];
  18. strcpy(storage.ptr, str);
  19. capacity = len + 1;
  20. }
  21. }
  22. const char* c_str() const {
  23. if (capacity == -1) {
  24. return storage.data;
  25. } else {
  26. return storage.ptr;
  27. }
  28. }
  29. ~String() {
  30. if (capacity != -1) {
  31. delete[] storage.ptr;
  32. }
  33. }
  34. };
  35. int main() {
  36. String s1("Hello111111111");
  37. String s2("a");
  38. std::clog << &s1 << '\t' << (void *) s1.c_str() << std::endl;
  39. std::clog << &s2 << '\t' << (void *) s2.c_str() << std::endl;
  40. return 0;
  41. }

标准库的字符串也是使用 SBO 优化的