同时查看 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/