我正在为一个类编写一个单元测试,以在没有可用内存时测试插入。nbElementInserted
它依赖于在返回后递增的事实insert_edge
。
void test()
{
adjacency_list a(true);
MemoryVacuum no_memory_after_this_line;
bool signalReceived = false;
size_t nbElementInserted = 0;
do
{
try
{
a.insert_edge( 0, 1, true ); // this should throw
nbElementInserted++;
}
catch(std::bad_alloc &)
{
signalReceived = true;
}
}
while (!signalReceived); // this loop is necessary because the
// memory vacuum only prevents new memory
// pages from being mapped. so the first
// allocations may succeed.
CHECK_EQUAL( nbElementInserted, a.nb_edges() );
}
现在我想知道这两种说法中哪一种是正确的:
- 可能会发生重新排序,在这种情况下
nbElementInserted
可以在insert_edge
引发异常之前递增,这会使我的情况无效。可能会发生重新排序,因为如果两行被置换,用户的可见结果是相同的。 - 重新排序不会发生,因为
insert_edge
它是一个函数,并且该函数的所有副作用都应该在转到下一行之前完成。投掷是副作用。
奖励点:如果正确答案是“是的,可能会发生重新排序”,那么 2 行之间的内存屏障是否足以修复它?