2013-10-13 5 views
8

最近、{}ブロックを単独で使用できることが発見されました。私には、これは本当に例えば、いくつかの例では、読みやすさを支援することができ、次のコードで:C++ブロック{}が負の影響を受ける

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

(IDEの自動インデントを戦うなし)になることができます:

スタイルオーバー別に主観的な意見から
push(); 
{ 
    foo(); 
    push(); 
    { 
     foo(); 
     foo(); 
    } 
    pop(); 
} 
pop(); 

これには悪影響があります(コンパイラからの最適化が少ない、別の用途があるなど)か、ブロックが安全です。

+3

これはスコープを定義します。スコープを定義するのは、これが "否定"であるかどうかは、スコープをどのように使用するかの結果です。たとえば、スコープが閉じる前に作成されたオブジェクトは破棄されるため、実際にこの動作が必要な場合を除き、これはマイナスの結果とみなされる可能性があります。 –

+3

これらはRAIIに有用です。 –

+0

@ AndonM.Colemanありがとう、本当に洞察力が... Googleは詳細情報を求めます。 – Ross

答えて

10

2番目の例のすべては100%正常です。余分なブロックは、その中で宣言された変数の範囲に影響を与えるかもしれませんが、あなたはそれをやっていません。

12

コードの意味が変更されていない場合(例のように)、最適化に影響する必要はありません。そうであれば、それは特定のコンパイラの特徴です。

は、あなたもこれを行うことができますあなたの pop()呼び出しがあなたの push()呼び出しをマップすることを強制するには、次の

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

...

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

パターンは、一般的にRAIIと呼ばれています。 はコードの意味を変更しますが、私のコードでpop()が呼び出され、foo()への呼び出しの1つが例外をスローすると呼び出されます。戻る前に何かを元に戻す必要がある(すべてではない)ほとんどの状況では、例外を取り消す必要があります。

3

このようなブロックを作成すると、新しいスコープが作成されます。したがって、これらのスコープへの入り口と出口でコンストラクタとデストラクタを実行することになります。あなたはまた、お互いを隠す機会が増えます。彼らは安全に使用することができますが、あなたはこれらのことを念頭に置いておく必要があります。

ところで、これは主観的ですが、私はあなたのスコープの使い方が読みやすさの助けになるとは感じていません。あなたは空白行で同じことを達成できました。レビューであなたのコードを見た場合、なぜあなたはそのようなスコープを作成していたのかと自問しています。

RAII style programmingと組み合わせて、有効期間の制御に役立つものが1つあります。この例では、ミューテックスが保持される時間を制限するためにスコープが使用されています。

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

Lockコンストラクタとデストラクタで解放それをでミューテックスを取得RAIIスタイルクラスです。スコープを明示的に使用すると、ロックが保持されている期間を制限できます。

+0

Re:読みやすさ、これは本当ですが、私は喜んで尋ねました。あなたの答えと他のものから、トンは学んでいます:) – Ross

関連する問題