たびたびお世話になります。
例外は重い処理だとよく見るんですが、
具体的に
例外が実際に投げられた時なのか、
それをcatchしたときなのか、
投げられなくてもtry{}catch{}で例外に対処するコード自体が重いのか
わかりません。
どなたか教えてください。
例外重い?
#include <windows.h>
#include <tchar.h>
int main()
{
try {
throw _T("message");
}catch(TCHAR *errormsg){
MessageBox(NULL, errormsg, _T("エラー!"), MB_OK);
}
return 0;
}
これだけだったら throw から message まで一瞬で飛んだけどなぁ。
throwの数が増えるとまた違うのだろうか。
設計上のトレードオフがありますので、
どこがどれだけ重いかは、処理系(コンパイラ)の実装によります。
> 例外が実際に投げられた時なのか、
> それをcatchしたときなのか、
例外が発生すると、例外オブジェクトの投入もそうですが、
その他のオブジェクトのデストラクタが走ります。
また、例外オブジェクトは通常複製されます。
> 投げられなくてもtry{}catch{}で例外に対処するコード自体が重いのか
try節では、仮に例外が投げられなくても、投げられたときに備えて、
どのオブジェクトを開放する必要があるかを記録する必要がありますので、
tryがないときに比べれば重くなりますが、どの程度かは処理系によります。
とはいえ、必要な処理であって無駄に重いわけではないです。
但し、同様な処理を自分でロングジャンプで実装することに比べれば安全で、
それなりに効率もよいはずです。
C++の方針としては「使わない機能のためのオーバヘッドを受けない」
C言語などで例外を一切使わない場合に比べれば重いのは、
その分の処理(自動開放)があるためです。
その必要がないならばtryを使わなければよく。
モット効率的に自分で実装できるか、恩恵がどれだけあるかで考えればいいのかと。
# とはいえ、C++の標準ライブラリも例外を投げうるものが多いので、
# 使えないものが増えて、旨みがなくなると思いますが…。
他言語と比較して、という意味だと、ガベコレがついてる言語では
開放処理についてあまり備えておく必要がない分(後で開放されるので)、
例外処理がお手軽なわけですが、C++のように開放タイミングを特定するためには
自分で処理を書くしかないという面倒くささとのトレードオフになります。
そださんBanさんありがとうございます。
例外処理においてかかるコストの大半は例外オブジェクトの生成とその他のオブジェクトの破棄にかかるんですね。
例外が投げられてもいないのにtry{}catch{}を書いただけで異常に重くなったりしたら嫌だなぁと思って質問したのですが、投げられた時の対処コードが増える分、若干重くなるんですね。
でも結局ぜんぶ処理系依存ってことは、あんまり深く考えないほうがいいのでしょうか?
ガベコレ
俺様用語ですか?
あけましておめでとうございます。
ガーベージコレクションかと・・・
以上。
素人に対する説明用語では無いだろうに。。
それもご丁寧に…乙ですねw
よほど、リアルタイム制約の厳しい箇所(ゲームのコアルーチンなど)でもない限り、
昨今のPCで例外処理の負荷を気にするようなことはあまりないと思います。
実際に書いてみて、気になるほどの時間になるならば「プロファイリング」して
どこに原因があるか探ってから性能を考えてもよいように思います。
# JavaやC#を勉強してる日本人技術者なら大抵通じるものかとも思いますが、
# そうでない人も考慮すれば確かに不適切かも。>ガベコレ
# 他言語云々は本旨ではなく、C++で書いてる限り直接的には関係ないと
# 思いますので、スルーしていただいてもかまいません。
みなさん、ありがとうございます。
いろいろと悩んでいたのですが、
実際に例外の重さがネックになるとわかったわけでもありませんし、
例外を使わないようにしようとするとすごく難しそうだったので、
素直に使っていこうと思います。
ツイート | ![]() |