libc++ 的 std::basic_string 为什么要使用 16 字节对齐模式?

6

在查看 libc++中std::basic_string的实现时,我发现在第1374行(写作时)有以下内容:

enum {__alignment = 16};

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

我可以理解一些四舍五入是为了避免内存碎片等问题,但是...

我想知道在这里使用硬编码的 16 是否有任何特定的理由,还是仅仅作为一个“好看的”数字而已。

对于64位机器,16 相当于 alignof(std::max_align_t),这是有一定道理的。但是同样的值在32位体系结构中也用于 __alignment,那么...?


2
就我所知,我已经在代码库上尝试了“svn blame”命令,或许可以在提交日志中找到一些线索,但是这个问题从@103490“libcxx initial import”开始就一直存在于代码库中... - DevSolar
1
在libc++中,堆分配的粒度是多少?它可能高达16个字节吗? - davidbak
如果我要猜的话,这可能是为了使std::string更加适合simd,从而在其上实现更快的算法。 - user4442671
甚至只是公交友好的。不知道@103490是什么时候(没有足够的动力去查看,我的错,抱歉),但是早期32位实现中是否有流行的机器具有16字节数据总线宽度?我不知道,SPARC可能吗? - davidbak
@103490 是将(显然已经存在的)libc++源代码导入到llvm仓库中...不知道之前的仓库是否还存在。 :-\ -- 在<memory>或其他地方找不到硬编码的16(除了在<deque>中,这显然与此无关)。 - DevSolar
显示剩余7条评论
1个回答

6
当我最初设计 <string> 时,libc++ 还没有注定成为开源软件。我只为苹果的平台编写代码。而且苹果的 malloc 总是分配至少16个字节,并以16个字节的倍数进行分配,无论你要求多少(至少在2007年是这样,我最近没有检查过)。
因此,如果最常用的分配器将给您16个字节,那么您可以充分利用它们。
曾经,在几年前的某个时候,我尝试更改分配器API,以便它可以询问分配器有关任何特定请求实际分配了多少内存。但那次尝试失败了。所以下一个最好的办法就是利用先验知识,即代码将要处理的最常见的分配器。

谢谢您提供的信息!alignof(max_align_t)不就是您要找的数字吗——标准内存分配的对齐方式? - DevSolar
2
是的。当时我没有使用它,因为它不在我的工具箱里。 - Howard Hinnant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接