计算CellBlock的大小

转载,请注明出处!

在Collector.h文件中有如下一行代码:

const size_t CELLS_PER_BLOCK = (BLOCK_SIZE - sizeof(Heap*)) * 8 * CELL_SIZE / (8 * CELL_SIZE + 1) / CELL_SIZE; // one bitmap byte can represent 8 cells.
我一直不明白这行计算式的原理何在?仔细阅读了相关类之后,心中有所悟。首先阅读Heap::cellBlock函数的实现。如下,
inline CollectorBlock* Heap::cellBlock(const JSCell* cell)
{
    return reinterpret_cast<CollectorBlock*>(reinterpret_cast<uintptr_t>(cell)&BLOCK_MASK);
}
根据这个函数可以得出一个结论,CollectorBlock对象的地址一定是按照BLOCK_SIZE对齐的。CollectorBlock的定义如下,
class CollectorBlock {
public:
    CollectorCell cells[CELLS_PER_BLOCK];
    CollectorBitmap marked;
    Heap* heap;
};

CollectorBlock对象占用的内存大小为:CELL_SIZE * CELLS_PER_BLOCK + CELLS_PER_BLOCK/8 + sizeof(Heap*),这个大小是以字节为单位的。很明显这个大小应该小于BLOCK_SIZE,即CELL_SIZE * CELLS_PER_BLOCK + CELLS_PER_BLOCK/8 + sizeof(Heap*) <= BLOCK_SIZE。如果将这个不等式看做等式,那么可以经过几步转化则可以得到文件中的计算式。转化步骤如下,

(8 * CELL_SIZE * CELLS_PER_BLOCK + CELLS_PER_BLOCK) / 8 = (BLOCK_SIZE - sizeof(Heap*))

(8 * CELL_SIZE + 1) * CELLS_PER_BLOCK = (BLOCK_SIZE - sizeof(Heap*)) * 8

CELLS_PER_BLOCK = (BLOCK_SIZE - sizeof(Heap*)) * 8 / (8 * CELL_SIZE + 1)

CELLS_PER_BLOCK = (BLOCK_SIZE - sizeof(Heap*)) * 8 * CELL_SIZE / (8 * CELL_SIZE + 1) * CELL_SIZE

CELLS_PER_BLOCK = (BLOCK_SIZE - sizeof(Heap*)) * 8 * CELL_SIZE / (8 * CELL_SIZE + 1) / CELL_SIZE

计算机上除法运算时下取整的。例如:3 / 2 = 1, 100 / 40 = 2等。因此,根据运算式获得的结果不会将BLOCK_SIZE个字节完全占有使用,会遗留一些paddings字节。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值