C++相談室 part44

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2005/11/25(金) 20:13:33
>>950
初期化しない int なら同じ可能性がまあまあ高い。もちろんコンパイラ依存だけど。
953デフォルトの名無しさん:2005/11/25(金) 21:58:02
>>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);

前者のほうがソースとしては楽&見た目すっきりだけどどうなんでしょ?
954デフォルトの名無しさん:2005/11/25(金) 22:14:59
endが無効化したらどうするんだこのスカタン
955デフォルトの名無しさん:2005/11/25(金) 22:22:40
いや、もちろんそういったものがないって前提で
956デフォルトの名無しさん:2005/11/25(金) 22:41:44
早いに決まってんだろこのド低脳が
957デフォルトの名無しさん:2005/11/25(金) 22:55:40
決まってはいないよ。質問は「STL等」についてだし、処理系も指定していないからね。
958デフォルトの名無しさん:2005/11/25(金) 22:56:21
>>956
不満事を書いた瓦を頭で割ってるCMの、
ナレーターの台詞を思い出した
959デフォルトの名無しさん:2005/11/25(金) 22:59:50
相当要素数が多くないと有意差は出ないよ.
実用的にはよほど効率を切り詰めたい部分でもなければ,毎回 end 呼んで構わないと思うけど.
960デフォルトの名無しさん:2005/11/25(金) 23:15:32
>for(list<int>::iterator it = hoge.begin(); it != hoge.end(); ++it);
この例だと、実質同じコードになる希ガス。
961デフォルトの名無しさん:2005/11/25(金) 23:34:53
>>960
試したのか? 俺の環境では g++, cl, bcc32 のどのコンパイラでも異なるコードを生成したぞ?
962デフォルトの名無しさん:2005/11/26(土) 00:26:28
Metrowerks CodeWarrior for Windows v8.3では全く同じコード。
963デフォルトの名無しさん:2005/11/26(土) 02:35:46
C++もそろそろネタ切れだな
964デフォルトの名無しさん:2005/11/26(土) 02:44:06
>>963
お前にとってはな。ということでさようなら。
965デフォルトの名無しさん:2005/11/26(土) 03:01:37
話は戻るけどswitch文の一部でしか使わない、しかも複数の箇所で使う変数はどうしてるの?
switch(c){
case 0: int i = 0 ;return i;
case 1: int i = 1; return i;
case 2: return 2;
}
面倒だからいい加減なサンプルだけどこれだとコンパイルエラーになる。
iをswitchの外側で定義すると初期化できないし。
case文の所を{}で囲めばいいんだけど正直見た目が悪いような。
966デフォルトの名無しさん:2005/11/26(土) 09:22:19
>965
変数の使いまわしなんかするくらいなら、多少見た目は悪くとも
>case文の所を{}で囲めば
これ一択だと思いますけど。
967デフォルトの名無しさん:2005/11/26(土) 09:33:19
Windowsのメウィンドウプロシージャなんかだと、
メッセージクラッカーを使うから半強制的に各caseの中身が関数に切り出されて、
そんな心配が要らなくなる。あくまで結果的にだけどね。
968デフォルトの名無しさん:2005/11/26(土) 09:47:55
「Windows限定」の話ならスレ違い
969デフォルトの名無しさん:2005/11/26(土) 10:01:08
>967 を「スレ違い」と認識するのは、理解力が足りない。
970デフォルトの名無しさん:2005/11/26(土) 10:14:00
参照って言うのは実態はなんですか?
たとえばWindowsでSendMessageで文字列をスレッド間で引き渡す場合、
ポインタだったらサブスレッドのスタックにある文字列を指していても、
SendMessageでWPARAMやLPARAMに乗っけてメインスレッドに渡せるじゃないですか。
参照は無理ですか?
971デフォルトの名無しさん:2005/11/26(土) 10:50:10
972デフォルトの名無しさん:2005/11/26(土) 11:05:36
これはいいのか?
973デフォルトの名無しさん:2005/11/26(土) 11:24:35
うん
974デフォルトの名無しさん:2005/11/26(土) 11:25:34
> 参照って言うのは実態はなんですか?

ポインタ

> 参照は無理ですか?

無理ではないがどっちかに統一したほうがいい
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を使用しています。
976デフォルトの名無しさん:2005/11/26(土) 12:26:57
>>975
そういうものです。
977デフォルトの名無しさん:2005/11/26(土) 12:44:24
>>975
自分で例外投げれ
978デフォルトの名無しさん:2005/11/26(土) 12:48:42
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;
}
}
980デフォルトの名無しさん:2005/11/26(土) 13:11:21
>>979
const参照で渡せば?
981デフォルトの名無しさん:2005/11/26(土) 13:24:00
>>975
Windowsには構造化処理例外(SEH)というのがある。
SEHではヌルポインタへのアクセスも例外となる。(その名称がNullPointerExceptionでないのが残念)
Winodws用のC++コンパイラは大抵C++例外の実装にこいつを使っているので、
そういう風にヌルポインタアクセスはcatchできる。
982デフォルトの名無しさん:2005/11/26(土) 13:56:50
>>974
サンキュ
983デフォルトの名無しさん:2005/11/26(土) 14:05:40
すみません。もうひとつ。
参照とポインタが実態としては同じと言うことは
どうにかコンパイラを騙せばポインタを渡す関数に参照を渡しても、その逆をやっても動きますか?
984デフォルトの名無しさん:2005/11/26(土) 14:11:46
>>980
具体的にはどのようにしたらよいのでしょうか?
985デフォルトの名無しさん:2005/11/26(土) 14:12:01
そんなことするくらいなら、Javaなりドトネトなりに行けよwwwww
986975: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を走らせても、やっぱり例外を捕捉してくれない…
# 記憶違い?
987デフォルトの名無しさん:2005/11/26(土) 14:12:31
>>985>>983へのレスね。
988デフォルトの名無しさん:2005/11/26(土) 14:14:35
>>986
newがNULLを返すか例外を投げるかは規定されてなかった希ガス
この2通りの内どちらかになるのは規定されてるが、どっちかはシラネ
989デフォルトの名無しさん:2005/11/26(土) 14:16:54
>>986
newが失敗してbad_allocを投げないのは規格違反。
VC7以降ならちゃんと投げるはず。
990デフォルトの名無しさん:2005/11/26(土) 14:58:19
>>986
規格上C++のcatchで受け取れるのは下に書いたのとあとはthrowされたもの。
bad_cast(dynamic_castで参照型のキャストに失敗したとき)
bad_typeid(動的なtypeidでヌルポインタが渡されたとき)
bad_exception(例外指定に合わない型の例外を投げようとしたとき)
991デフォルトの名無しさん:2005/11/26(土) 19:33:02
>>953
>前者のほうがソースとしては楽&見た目すっきりだけどどうなんでしょ?
for(list<int>::iterator it = hoge.begin(), end = hoge.end (); it != end; ++it);
とか
992デフォルトの名無しさん:2005/11/26(土) 19:55:40
次スレ立てられなかった。誰かよろしこ。
993(*^ー゚)b グッジョブ!!:2005/11/26(土) 21:21:10
994デフォルトの名無しさん:2005/11/26(土) 21:27:41
// ちょっとここをお借りしますよ。

class CTest1;
class CTest2;

class CTest1
{
public:
CTest2 *pCTest2;
};
class CTest2
{
public:
CTest1 *pCTest1;
};
995v(^・^)v:2005/11/26(土) 21:42:14
>>993
テンプレ補完終了
996デフォルトの名無しさん:2005/11/26(土) 22:27:19
>>993
997デフォルトの名無しさん:2005/11/26(土) 23:08:41
997
998デフォルトの名無しさん:2005/11/26(土) 23:53:40
998
999デフォルトの名無しさん:2005/11/26(土) 23:54:33
999
1000デフォルトの名無しさん:2005/11/26(土) 23:55:04
!!!
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。