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
已经设置为 next 和 的最小值max_blocks_per_chunk
。所以这应该已经在有效范围内。
在这种情况下除以-1
pool_block 有什么作用?
解决方案
请注意,这std::size_t(-1) / pool_block
是std::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
.