我正在浏览一些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有什么作用?
答案 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 work,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
将会溢出。