首页 > 解决方案 > 避免溢出提升容器

问题描述

我正在查看一些 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已经设置为 next 和 的最小值max_blocks_per_chunk。所以这应该已经在有效范围内。

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

标签: c++

解决方案


请注意,这std::size_t(-1) / pool_blockstd::size_t乘以pool_block时不会溢出 a的最大值std::size_t。(因为std::size_t它是无符号的,并且由于有符号到无符号整数转换的工作方式,std::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_block如果blocks_per_chunk > std::size_t(-1) / pool_block.


推荐阅读