c ++块{}会产生负面影响

时间:2013-10-13 20:17:37

标签: c++

我最近发现{}块可以单独使用。对我来说,在某些情况下,这可能是真正的辅助可读性。例如,在以下代码中:

push();
foo();
push();
foo();
foo();
pop();
pop();

可以成为(不与IDE自动缩进对抗):

push();
{
    foo();
    push();
    {
        foo();
        foo();
    }
    pop();
}
pop();

除了对风格的主观意见之外,这是否会产生任何负面影响(比如编译器的较少受害者,他们还有其他用途等)或者这些是否可以安全使用。

3 个答案:

答案 0 :(得分:12)

当它们不改变代码的含义时(如在您的示例中),没有理由它们应该对优化产生任何影响。如果他们这样做,那么这是特定编译器的怪癖。

要强制您的pop()来电映射push()来电,您甚至可以这样做:

struct Pusher {
    Pusher() { push(); }
    ~Pusher() { pop(); }
};

...

{
    Pusher p1;
    foo();
    {
        Pusher p2;
        foo();
        foo();
    }
}

该模式通常称为RAII。它确实改变了代码的含义 - 在我的代码pop()中,如果对foo()的一个调用引发异常,则会调用{{1}}。吨。在大多数(但不是全部)需要在返回之前撤消某些内容的情况下,您还需要撤消异常。

答案 1 :(得分:10)

关于你的第二个例子的一切都是100%罚款。额外的块可能会影响在它们中声明的变量的范围,但是你没有这样做。

答案 2 :(得分:3)

创建这样的块会创建新的范围。因此,您将在进入和退出这些范围时运行构造函数和析构函数。您还有更多机会让名字互相隐藏。它们可以安全使用,但你必须记住这些事情。

顺便说一句,这是主观的,但我发现你对范围的使用有助于提高可读性。你可以用空行完成同样的事情。如果我在评论中看到您的代码,我会问自己为什么要创建这样的范围。

有一个范围对于与RAII style programming一起控制生命期非常有用。在此示例中,范围用于限制互斥锁保留的时间。

int a = b + c;
{
   OS::Mutex::Lock lock(mutex);
   some_shared_variable = a;
}

此处Lock是一个RAII样式类,它在构造函数中获取互斥锁并在析构函数中释放它。通过显式使用范围,您可以限制锁定的持续时间。