>>950 初期化しない int なら同じ可能性がまあまあ高い。もちろんコンパイラ依存だけど。
>>950 とはちがうけど、
STL等の走査で、iterator の終端の判定用にインスタンス別に作ったほうが早いのかな?
1.
for(list<int>::iterator it = hoge.begin(); it != hoge.end(); ++it);
2.
list<int>::iterator end = hoge.end();
for(list<int>::iterator it = hoge.begin(); it != end; ++it);
前者のほうがソースとしては楽&見た目すっきりだけどどうなんでしょ?
endが無効化したらどうするんだこのスカタン
いや、もちろんそういったものがないって前提で
早いに決まってんだろこのド低脳が
決まってはいないよ。質問は「STL等」についてだし、処理系も指定していないからね。
>>956 不満事を書いた瓦を頭で割ってるCMの、
ナレーターの台詞を思い出した
相当要素数が多くないと有意差は出ないよ. 実用的にはよほど効率を切り詰めたい部分でもなければ,毎回 end 呼んで構わないと思うけど.
>for(list<int>::iterator it = hoge.begin(); it != hoge.end(); ++it); この例だと、実質同じコードになる希ガス。
>>960 試したのか? 俺の環境では g++, cl, bcc32 のどのコンパイラでも異なるコードを生成したぞ?
Metrowerks CodeWarrior for Windows v8.3では全く同じコード。
963 :
デフォルトの名無しさん :2005/11/26(土) 02:35:46
C++もそろそろネタ切れだな
>>963 お前にとってはな。ということでさようなら。
話は戻るけどswitch文の一部でしか使わない、しかも複数の箇所で使う変数はどうしてるの? switch(c){ case 0: int i = 0 ;return i; case 1: int i = 1; return i; case 2: return 2; } 面倒だからいい加減なサンプルだけどこれだとコンパイルエラーになる。 iをswitchの外側で定義すると初期化できないし。 case文の所を{}で囲めばいいんだけど正直見た目が悪いような。
>965 変数の使いまわしなんかするくらいなら、多少見た目は悪くとも >case文の所を{}で囲めば これ一択だと思いますけど。
Windowsのメウィンドウプロシージャなんかだと、 メッセージクラッカーを使うから半強制的に各caseの中身が関数に切り出されて、 そんな心配が要らなくなる。あくまで結果的にだけどね。
「Windows限定」の話ならスレ違い
>967 を「スレ違い」と認識するのは、理解力が足りない。
970 :
デフォルトの名無しさん :2005/11/26(土) 10:14:00
参照って言うのは実態はなんですか? たとえばWindowsでSendMessageで文字列をスレッド間で引き渡す場合、 ポインタだったらサブスレッドのスタックにある文字列を指していても、 SendMessageでWPARAMやLPARAMに乗っけてメインスレッドに渡せるじゃないですか。 参照は無理ですか?
これはいいのか?
うん
> 参照って言うのは実態はなんですか? ポインタ > 参照は無理ですか? 無理ではないがどっちかに統一したほうがいい win32apiだとかを呼びまくる場所ではポインタのほうがいい 抽象化が十分になされた、アプリケーションロジックが主体のレイヤでは 参照のほうがいい 混ざってるのはたいへん見苦しいしバグの温床
975 :
デフォルトの名無しさん :2005/11/26(土) 12:24:23
C++って、以下のようなコードで例外を出してくれないのでしょうか。 struct test *p = NULL; int val; try{ val = p->member; } catch(...){ std::cout << "例外をキャッチ" << std::endl; } またtryのなかを val = 100/0; とかに変更してみても、例外を投げずにアプリケーションエラーとなりました。 そういうものなんでしょうか? WinXPでmingwを使用しています。
catch(...)でWIN32構造化例外が取れるかどうかはコンパイラ依存
979 :
デフォルトの名無しさん :2005/11/26(土) 13:06:38
関数example1からexample2にmultimapのtestMapを引き渡したいのですが どうしたらうまくいくでしょうか? 以下のような感じなのですが void example1 (){ MMAP testMap; testMap.insert(Mvalue([配列])); } void example2(MMAP map){ for(MMAP::iterator i=testMap.begin(),end=testMap.end(); i!=end; i++){ cout << *i << endl; } }
>>975 Windowsには構造化処理例外(SEH)というのがある。
SEHではヌルポインタへのアクセスも例外となる。(その名称がNullPointerExceptionでないのが残念)
Winodws用のC++コンパイラは大抵C++例外の実装にこいつを使っているので、
そういう風にヌルポインタアクセスはcatchできる。
すみません。もうひとつ。 参照とポインタが実態としては同じと言うことは どうにかコンパイラを騙せばポインタを渡す関数に参照を渡しても、その逆をやっても動きますか?
>>980 具体的にはどのようにしたらよいのでしょうか?
そんなことするくらいなら、Javaなりドトネトなりに行けよwwwww
986 :
975 :2005/11/26(土) 14:12:06
ありがとうございます。
VC8 Expressのコンパイラで__tryと__exceptを使用してみると、確かにキャッチできました。
C++が勝手に投げてくれるのは、標準例外
http://www.02.246.ne.jp/~torutk/cxx/exception/stdexceptions.html にあるものだけ、という認識でよいのでしょうか。
しかし、newで失敗してもbad_allocを投げないコンパイラがあったり(VCのことだと
思うのですが)するようですので、C++における標準例外の
位置づけがいまいちわかりません…
以下本題とは逸れるのですが。
書籍「.NET&Windowsプログラマのためのデバッグテクニック徹底解説」の記述によると
> catch(...)はC++例外を補足するだけでなく、SEH例外も捕捉することになっているのです
ということでした。
VC6+MFCのプログラムで、NULL参照をcatchしていたのを見て、てっきり
C++の機能で面倒見てくれているのだと思っていました。
# ただ、VC8で
>>975 を走らせても、やっぱり例外を捕捉してくれない…
# 記憶違い?
>>986 newがNULLを返すか例外を投げるかは規定されてなかった希ガス
この2通りの内どちらかになるのは規定されてるが、どっちかはシラネ
>>986 newが失敗してbad_allocを投げないのは規格違反。
VC7以降ならちゃんと投げるはず。
>>986 規格上C++のcatchで受け取れるのは下に書いたのとあとはthrowされたもの。
bad_cast(dynamic_castで参照型のキャストに失敗したとき)
bad_typeid(動的なtypeidでヌルポインタが渡されたとき)
bad_exception(例外指定に合わない型の例外を投げようとしたとき)
>>953 >前者のほうがソースとしては楽&見た目すっきりだけどどうなんでしょ?
for(list<int>::iterator it = hoge.begin(), end = hoge.end (); it != end; ++it);
とか
次スレ立てられなかった。誰かよろしこ。
// ちょっとここをお借りしますよ。 class CTest1; class CTest2; class CTest1 { public: CTest2 *pCTest2; }; class CTest2 { public: CTest1 *pCTest1; };
997
998
999
!!!
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。