c++ - libc++ 的 std::basic_string 的 16 字节对齐模式背后的原因是什么?

标签 c++ string c++11 libc++

同时查看 the libc++ implementation of std::basic_string ,我在第 1374 行遇到了这个(在撰写本文时):

enum {__alignment = 16};

此值用于后续对齐计算,字符串大小请求四舍五入为该数字的倍数。

我可以接受一些舍入是为了避免内存碎片或其他什么,但是......

我想知道在这里使用硬编码的 16 作为数字背后是否有任何特定的理由,或者它是否只是用作“漂亮的‘圆’数字”。

对于 64 位机器,16 相当于 alignof( std::max_align_t ),这在某种程度上是有道理的。但是 __alignment 的完全相同的值也用于 32 位架构,所以...?

最佳答案

当我第一次设计<string> , libc++ 还没有注定要开源。我只为 Apple 的平台写作。还有苹果的malloc总是分配至少 16 个字节,并且是 16 个字节的倍数,无论您要求多少(至少在 2007 年是这样,我最近没有检查过)。

因此,如果最常用的分配器要给你 16 个字节,你不妨使用它们。

有一次,几年前,我试图 change the allocator API so that it could ask the allocator how much memory it actually handed out for any particular request .但那次尝试失败了。因此,下一个最好的事情是利用代码将要处理的最常见分配器的先验知识。

关于c++ - libc++ 的 std::basic_string 的 16 字节对齐模式背后的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50452960/

相关文章:

c++ - Eigen 库 : SVD is slow compared to GSL

c# - 比较字符串数组的最佳方法(自定义命令行命令)

c++ - 从可变参数模板调用仿函数

c++ - 使用并行模式库 (ppl.h)

c++ - 如何使用 open64 编译器构建 boost 库?

string - 我应该如何测试方法中的 null 和/或空字符串参数?

ruby - 如何比较忽略大小写的字符串

c++ - 没有全局运营商的裸机新

c++ - 使用带有字符串参数的 Variadic 模板函数调用的正确方法 c++

c++ - 具有多个条件的默认模板特化