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

Dev*_*lar 7 c++ string rationale c++11 libc++

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

enum {__alignment = 16};
Run Code Online (Sandbox Code Playgroud)

此值用于后续对齐计算,字符串大小请求向上舍入为此数字的倍数.

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

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

对于64位计算机来说,16相当于alignof( std::max_align_t ),这是有道理的.但完全相同的值__alignment也用于32位架构,所以......?

How*_*ant 5

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

因此,如果最常用的分配器将为您提供16个字节,那么您也可以在容量中使用它们.

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

  • 是.我没有使用它,因为它当时不在我的工具箱中. (2认同)