簡體   English   中英

c ++塊{}會產生負面影響

[英]Do c++ blocks { } have a negative impact

我最近發現{}塊可以單獨使用。 對我來說,在某些情況下,這可能是真正的輔助可讀性。例如,在以下代碼中:

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

可以成為(不與IDE自動壓縮):

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

除了對風格的主觀意見之外,這是否會產生任何負面影響(比如編譯器中的較少受害者,它們還有其他用途等)或這些塊是否可以安全使用。

當它們不改變代碼的含義時(如在您的示例中),沒有理由它們應該對優化產生任何影響。 如果他們這樣做,那么這是特定編譯器的怪癖。

要強制你的pop()調用映射push()調用,你甚至可以這樣做:

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

...

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

該模式通常稱為RAII。 確實改變了代碼的含義 - 在我的代碼中,如果對foo()一個調用拋出異常,則會調用pop() ,而在你的代碼中則不會。 在大多數(但不是全部)需要在返回之前撤消某些內容的情況下,您還需要撤消異常。

關於你的第二個例子的一切都是100%罰款。 額外的塊可能會影響在它們中聲明的變量的范圍,但是你沒有做任何這些。

像這樣創建塊會創建新的范圍。 因此,您將在進入和退出這些范圍時運行構造函數和析構函數。 您還有更多機會讓名字互相隱藏。 它們可以安全使用,但您必須牢記這些事情。

順便說一下,這是主觀的,但我沒有發現你對范圍的使用有助於提高可讀性。 你可以用空行完成同樣的事情。 如果我在評論中看到您的代碼,我會問自己為什么要創建這樣的范圍。

RAII風格編程一起控制生命期的一個范圍是有用的。 在此示例中,范圍用於限制互斥鎖保持的時間量。

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

這里的Lock是一個RAII樣式類,它在構造函數中獲取互斥鎖並在析構函數中釋放它。 通過顯式使用范圍,您可以限制鎖定的持續時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM