在查看
the libc++ implementation of std::basic_string时,我在1374行(在撰写本文时)遇到了这个问题:
enum {__alignment = 16};
此值用于后续对齐计算,字符串大小请求将向上舍入为此数字的倍数.
我可以接受一些舍入是为了避免内存碎片或其他什么,但……
我想知道在这里使用硬编码16作为数字背后是否存在任何特定的理由,或者它是否只是用作“漂亮的’圆形’数字”.
对于64位计算机,16对等于(std :: max_align_t),这是有道理的.但__alignment的完全相同的值也用于32位架构,所以…?
解决方法
当我第一次设计< string>时,libc还没有注定是开源的.我只是为Apple的平台写作.并且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.但是那次尝试失败了.因此,下一个最好的事情是利用对代码要处理的最常见分配器的先验知识.