Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 做c++;块{}具有负面影响_C++ - Fatal编程技术网

C++ 做c++;块{}具有负面影响

C++ 做c++;块{}具有负面影响,c++,C++,我最近发现{}块可以自己使用。对我来说,这在某些情况下确实有助于可读性,例如,在以下代码中: push(); foo(); push(); foo(); foo(); pop(); pop(); 可以成为(无需自动缩进): 除了对样式的主观看法外,这是否有任何负面影响(如编译器的优化减少、它们有其他用途等),或者这些块是否可以安全使用。关于第二个示例的所有内容都是100%好的。额外的块可能会影响其中声明的变量的范围,但您不会这样做。当它们不改变代码的含义(如您的示例中所示)时,它们没有理由对优

我最近发现
{}
块可以自己使用。对我来说,这在某些情况下确实有助于可读性,例如,在以下代码中:

push();
foo();
push();
foo();
foo();
pop();
pop();
可以成为(无需自动缩进):


除了对样式的主观看法外,这是否有任何负面影响(如编译器的优化减少、它们有其他用途等),或者这些块是否可以安全使用。

关于第二个示例的所有内容都是100%好的。额外的块可能会影响其中声明的变量的范围,但您不会这样做。

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

要强制您的
pop()
调用映射您的
push()
调用,您甚至可以执行以下操作:

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


该模式通常称为RAII。但是,它确实改变了代码的含义——在我的代码中,如果对
foo()
的调用之一抛出异常,则将调用
pop()
,而在您的代码中则不会。在大多数(但不是所有)情况下,您需要在返回前撤消某些操作,也需要撤消异常。

创建这样的块会创建新的作用域。因此,在进入和退出这些作用域时,将运行构造函数和析构函数。你也会有更多的机会让名字彼此隐藏。它们使用起来很安全,但你必须记住这些

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

作用域有一点很有用,那就是控制生命周期。在本例中,作用域用于限制保持互斥的时间量

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

这里,
Lock
是一个RAII风格的类,它在构造函数中获取互斥体,并在析构函数中释放互斥体。通过显式使用作用域,您可以限制锁被保持的时间。

它们定义了一个作用域,这是否为“负”取决于您如何使用它们。例如:在中创建的对象将在作用域关闭之前销毁,因此,除非您确实想要/需要此行为,否则这可能被视为负面后果。它们对RAII有用。@AndonM.Coleman谢谢,非常有见地。。。Re:可读性,这是真的,但我很高兴我问了。从你和其他人的回答中,我们学到了很多:)
{
    Pusher p1;
    foo();
    {
        Pusher p2;
        foo();
        foo();
    }
}
int a = b + c;
{
   OS::Mutex::Lock lock(mutex);
   some_shared_variable = a;
}