避免溢出升压容器

时间:2018-12-13 13:11:21

标签: c++

我正在浏览一些Boost容器内存池代码,并遇到了以下我不理解的内容,完整的来源.cpp .h

//Limit max value
std::size_t blocks_per_chunk
    = boost::container::dtl::min_value(max_blocks_per_chunk, next_blocks_per_chunk);
//Avoid overflow
blocks_per_chunk
    = boost::container::dtl::min_value(blocks_per_chunk, std::size_t(-1)/pool_block);

具体来说,我不明白第二行代码如何“避免溢出”。 blocks_per_chunk已设置为下一个和max_blocks_per_chunk的最小值。因此,这应该已经在有效范围内。

在这种情况下,将-1除以pool_block有什么作用?

1 个答案:

答案 0 :(得分:3)

请注意,std::size_t(-1) / pool_block是最大的std::size_t值,乘以pool_block不会溢出std::size_t。 (由于std::size_t是无符号的,并且由于how signed-to-unsigned integer conversions workstd::size_t(-1)是可表示的最大std::size_t值,即等于std::numeric_limits<std::size_t>::max(),但键入时要短一些)

我怀疑其目的是将blocks_per_chunk限制为使用该变量不会在后续数学运算中引起溢出的值。实际上,以下代码紧随其后:

//Minimum block size is at least max_align, so all pools allocate sizes that are multiple of max_align,
//meaning that all blocks are max_align-aligned.
char *p = static_cast<char *>(block_slist_base_t::allocate(blocks_per_chunk*pool_block, mr));

在这里,如果blocks_per_chunk * pool_blockblocks_per_chunk > std::size_t(-1) / pool_block将会溢出。