这个大小调整代码在 C 中的优势是什么?

Hen*_*per 2 c twos-complement commonmark cmark

为通用问题标题道歉,我不知道如何正确表达它(欢迎提出建议!)

我试图了解Common Mark 解析器的一些代码并遇到了这个:

  /* Oversize the buffer by 50% to guarantee amortized linear time
   * complexity on append operations. */
  bufsize_t new_size = target_size + target_size / 2;
  new_size += 1;
  new_size = (new_size + 7) & ~7;
Run Code Online (Sandbox Code Playgroud)

因此,给定一个数字,例如 32,它将加 (32 / 2) [48]、加 1 [49]、加 7 [56],最后与 -8 [56] 相加。

这是一种常见的模式吗?特别是添加一个数字,然后与它的补码进行 AND 运算。

是否有人能够深入了解这是做什么以及存在哪些优势(如果有)?

axi*_*iac 5

(+7) & ~7部分将数字向上舍入为 的第一个倍数8。它仅适用于2( 7is 2^3-1) 的幂。如果您想四舍五入为 的倍数,请32使用31代替7

将大小四舍五入为整数倍的8原因可能特定于算法。

也有可能代码的作者知道内存分配器是如何工作的。如果分配器在内部使用多个8字节的内存块,则在1和之间的任意数量字节的分配请求将8使用整个块。通过要求一个大小为 1 的倍数的块,以8相同的价格获得几个额外的字节。