7

在查看std::basic_string 的 libc++ 实现时,我在第 1374 行遇到了这个问题(在撰写本文时):

enum {__alignment = 16};

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

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

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

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

4

1 回答 1

5

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

因此,如果最常用的分配器要给您 16 个字节,那么您不妨在自己的能力范围内使用它们。

几年前的某个时候,我尝试更改分配器 API,以便它可以询问分配器实际上为任何特定请求分配了多少内存。但那次尝试失败了。因此,下一个最好的事情是利用代码将要处理的最常见分配器的先验知识。

于 2018-05-23T21:11:16.630 回答