0%

16字节内存对齐算法探究

16字节内存对齐算法我们先从下方的两个两种方法来探究:

  • alloc源码分析中的align16:
  • malloc源码分析中的segregated_size_to_fit

align16: 16字节对齐算法

1
2
3
static inline size_t align16(size_t x) {
return (x + size_t(15)) & ~size_t(15);
}

image.png

  • 首先将原始的内存 8 与 size_t(15)相加,得到 8 + 15 = 23
  • 将 size_t(15) 即 15进行~(取反)操作,~(取反)的规则是:1变为0,0变为1
  • 最后将 23 与 15的取反结果 进行 &(与)操作,&(与)的规则是:都是1为1,反之为0,最后的结果为 16,即内存的大小是以16的倍数增加的

segregated_size_to_fit: 16字节对齐算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#define SHIFT_NANO_QUANTUM		4
#define NANO_REGIME_QUANTA_SIZE (1 << SHIFT_NANO_QUANTUM) // 16

static MALLOC_INLINE size_t
segregated_size_to_fit(nanozone_t *nanozone, size_t size, size_t *pKey)
{
size_t k, slot_bytes;

if (0 == size) {
size = NANO_REGIME_QUANTA_SIZE; // Historical behavior
}
k = (size + NANO_REGIME_QUANTA_SIZE - 1) >> SHIFT_NANO_QUANTUM; // round up and shift for number of quanta
slot_bytes = k << SHIFT_NANO_QUANTUM; // multiply by power of two quanta size
*pKey = k - 1; // Zero-based!

return slot_bytes;
}

算法原理:
k + 15 >> 4 << 4 ,其中 右移4 + 左移4 相当于将后4位抹零,跟 k/16 * 16一样 ,是16字节对齐算法,小于16就成0了
以 k = 2为例,如下图所示
image.png

-------------本文结束感谢您的阅读-------------