2

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

我试图了解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;

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

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

有没有人能够提供任何关于这是在做什么以及存在哪些优势(如果有的话)的见解?

4

1 回答 1

5

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

将大小四舍五入的原因8可能是特定于算法的。

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

于 2021-05-26T08:47:10.030 回答