为什么 sizeof(string) == 32?

新手上路,请多包涵

导致 sizeof() 为 32 的字符串结构中的开销是什么?

原文由 agam 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 770
1 个回答

最现代 std::string 实现1将非常小的字符串直接保存在堆栈中的静态大小的 char 数组中,而不是使用动态堆存储。这称为 小(或短)字符串优化(SSO)。它允许实现避免小字符串对象的堆分配并提高引用的局部性。

此外,将有一个 std::size_t 成员来保存字符串大小和一个指向实际 char 存储的指针。

具体实现的方式有所不同,但以下几行是可行的:

 template <typename T>
struct basic_string {
    char* begin_;
    size_t size_;
    union {
        size_t capacity_;
        char sso_buffer[16];
    };
};

sizeof (void*) = 8 的典型架构上,这给了我们 32 字节的总大小。


1 “三巨头”(GCC 的 libstdc++ 版本 5,Clang 的 libc++ 和 MSVC 的实现)都做到了。其他人也可能。

原文由 Konrad Rudolph 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题