前スレ
C++相談室 part158
https://mevius.5ch.net/test/read.cgi/tech/1645239402/
C++相談室 part160
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2022/04/15(金) 08:39:32.42ID:WMzvufu2277デフォルトの名無しさん
2022/04/23(土) 19:53:40.19ID:MFWNsjL4278デフォルトの名無しさん
2022/04/23(土) 20:01:38.15ID:pT174lS4279デフォルトの名無しさん
2022/04/23(土) 20:07:10.88ID:7+1nJnMo >>267
人迷惑と言う意味で一緒だよ
人迷惑と言う意味で一緒だよ
280デフォルトの名無しさん
2022/04/23(土) 20:10:26.67ID:BMKo0y1z お前らいつまで、そんな話ししてんだよ
世の中はさとみのお祝いムードでも盛り上がってんの二
世の中はさとみのお祝いムードでも盛り上がってんの二
281デフォルトの名無しさん
2022/04/23(土) 20:12:03.42ID:6Eu3cwLL signal と SEH なら SEH の方がマシだな
signal ハンドラーはマルチスレッドで個々のハンドラー持てないし
signal ハンドラーはマルチスレッドで個々のハンドラー持てないし
282デフォルトの名無しさん
2022/04/23(土) 20:21:15.45ID:nWwnCTH/ スレッド毎に設定できないシングルトンなデータといえばカレントディレクトリとか
283デフォルトの名無しさん
2022/04/23(土) 20:42:16.92ID:kGr5D+hC SEHとかのコスト掛けてするのは本末転倒
ゼロ除算は事前if文0比較でコスト安い
ゼロ除算は事前if文0比較でコスト安い
284デフォルトの名無しさん
2022/04/23(土) 21:07:07.31ID:1ji6Qm2J 例外の実装として sjlj と SEH とのどちらが優れているか、という話ではなかったのか?
285デフォルトの名無しさん
2022/04/23(土) 21:09:05.54ID:yDjwvYRz286蟻人間 ◆T6xkBnTXz7B0
2022/04/23(土) 21:20:35.92ID:51eUfy6p287デフォルトの名無しさん
2022/04/23(土) 21:26:55.58ID:FYLNDVY0288蟻人間 ◆T6xkBnTXz7B0
2022/04/23(土) 21:29:35.47ID:51eUfy6p >>287
/SHaのtry-catchでSEH機構を使ってるのは事実だし、確かめもしないやつに言われたくない。
/SHaのtry-catchでSEH機構を使ってるのは事実だし、確かめもしないやつに言われたくない。
289蟻人間 ◆T6xkBnTXz7B0
2022/04/23(土) 21:40:18.76ID:51eUfy6p https://cutlassfish.wordpress.com/2014/08/12/mingw-w64-%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E9%9A%9B%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AB%E3%81%AA%E3%82%8B%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%83%A2%E3%83%87%E3%83%AB%E3%81%A8%E4%BE%8B/
MinGW-w64 の例外機構は、SJLJ、DWARF、SEHの3つ。MinGW-w64におけるC++の例外はこのいずれかで実装されている。
MinGW-w64 の例外機構は、SJLJ、DWARF、SEHの3つ。MinGW-w64におけるC++の例外はこのいずれかで実装されている。
290デフォルトの名無しさん
2022/04/23(土) 21:41:28.57ID:qKJLJkGn それは嘘だな
例えば単純にプログラムの中でthrow投げるとする
当然SEHは使われない
例えば単純にプログラムの中でthrow投げるとする
当然SEHは使われない
291蟻人間 ◆T6xkBnTXz7B0
2022/04/23(土) 21:43:17.83ID:51eUfy6p 単純な例外処理は最適化で消えることがある。常識。
292デフォルトの名無しさん
2022/04/23(土) 21:46:06.95ID:dgvSdybL293蟻人間 ◆T6xkBnTXz7B0
2022/04/23(土) 22:07:33.30ID:51eUfy6p >>292
https://stackoverflow.com/questions/3311641/c-exception-throw-catch-optimizations
Even simpler cases could be optimized, such as:
int func() {
try {
throw 42;
}catch(int x) {
return x;
}
}
The above code can be transformed into return 42. There are no technical reasons that impede it.
https://stackoverflow.com/questions/3311641/c-exception-throw-catch-optimizations
Even simpler cases could be optimized, such as:
int func() {
try {
throw 42;
}catch(int x) {
return x;
}
}
The above code can be transformed into return 42. There are no technical reasons that impede it.
294蟻人間 ◆T6xkBnTXz7B0
2022/04/23(土) 22:09:39.97ID:51eUfy6p 君の単純なthrowの例では
std::terminate()
になるかもしれない。
std::terminate()
になるかもしれない。
295デフォルトの名無しさん
2022/04/23(土) 22:11:37.95ID:qFv4TdcK297デフォルトの名無しさん
2022/04/23(土) 22:17:03.10ID:68vu283x ・まずtryの中で別の関数を呼び出さないと最もベーシックなパターンにすらなっていない
・呼び出される別の関数の中でも特定条件時のみthrowしないと例外処理の意味を持たない
・呼び出される別の関数の中でも特定条件時のみthrowしないと例外処理の意味を持たない
298蟻人間 ◆T6xkBnTXz7B0
2022/04/23(土) 22:17:27.90ID:51eUfy6p 君の父親は言い負かされようになると「バカにしてるのか」と言う癖があるようだね。愚かな人間ども。
299デフォルトの名無しさん
2022/04/23(土) 22:21:38.82ID:7+1nJnMo >>286,288
オプションもまともに書けないとかお前さん使ってないだろw
/EHa使っても構造化例外がcatchでキャッチできるようになるだけでthrowで構造化例外を送出できるようになるわけじゃないぞ
https://docs.microsoft.com/ja-jp/cpp/build/reference/eh-exception-handling-model?view=msvc-170
オプションもまともに書けないとかお前さん使ってないだろw
/EHa使っても構造化例外がcatchでキャッチできるようになるだけでthrowで構造化例外を送出できるようになるわけじゃないぞ
https://docs.microsoft.com/ja-jp/cpp/build/reference/eh-exception-handling-model?view=msvc-170
300デフォルトの名無しさん
2022/04/23(土) 22:21:59.63ID:6DdDEQOn なぜそんなおバカなコード例をわざわざ披露するのか常識を疑う
301デフォルトの名無しさん
2022/04/23(土) 22:24:23.21ID:6GwypHXA これだから蟻人問の書き込みは全く信頼できない
302蟻人間 ◆T6xkBnTXz7B0
2022/04/23(土) 22:27:21.96ID:51eUfy6p303デフォルトの名無しさん
2022/04/23(土) 22:32:14.74ID:8fErgiPg304蟻人間 ◆T6xkBnTXz7B0
2022/04/23(土) 22:34:18.65ID:51eUfy6p306蟻人間 ◆T6xkBnTXz7B0
2022/04/23(土) 22:43:43.42ID:51eUfy6p 例外機構をsjljで実装するのもsehで実装するのもMinGWにある。君はいつまでも駄々っ子みたいに存在を認めないんだね。
307デフォルトの名無しさん
2022/04/23(土) 22:45:00.85ID:E16t2nqa 行き詰まった敗者の典型パターン
「授業料払わないやつには教えない」
「教えて欲しかったら金払え」
「業務でもないのに答えられるか」
「授業料払わないやつには教えない」
「教えて欲しかったら金払え」
「業務でもないのに答えられるか」
308デフォルトの名無しさん
2022/04/23(土) 22:58:24.91ID:b7qvDYHN SEHでC++のtry-catchを実装とか意味不明な主張してるんだな
309蟻人間 ◆T6xkBnTXz7B0
2022/04/23(土) 23:01:30.10ID:51eUfy6p MinGW-w64 SEH版の例外機構はSEHで実装されている(公開情報)。これを否定から入るなら議論はできない。
310デフォルトの名無しさん
2022/04/23(土) 23:07:40.34ID:Erk9N28U311デフォルトの名無しさん
2022/04/23(土) 23:18:30.07ID:BETrb0gR 結局実装の話してる人の精神状態が心配
312デフォルトの名無しさん
2022/04/23(土) 23:25:16.57ID:BMKo0y1z そろそろc++の話ししようぜ
2項演算子.*や->*が返却するオブジェクトの型を取得したい
規格にはapplication演算子が後続する場合のみ認めているが
その際の型をコンパイル時に取得したい
さらにdeclvalに渡したい
2項演算子.*や->*が返却するオブジェクトの型を取得したい
規格にはapplication演算子が後続する場合のみ認めているが
その際の型をコンパイル時に取得したい
さらにdeclvalに渡したい
313デフォルトの名無しさん
2022/04/23(土) 23:31:45.53ID:XUudJER7 なぜa.bとa->bという無駄な2種類を用意したんだろう?
他の言語ではaがポインタでもa.bだよね
型から間違いが起きようがないのだからa->bは不要だと思う
他の言語ではaがポインタでもa.bだよね
型から間違いが起きようがないのだからa->bは不要だと思う
314デフォルトの名無しさん
2022/04/23(土) 23:33:55.91ID:BMKo0y1z315デフォルトの名無しさん
2022/04/23(土) 23:35:30.32ID:BMKo0y1z お前ら聞いても無駄だな
例外とSEHの区別が付かないレベルだろうし
例外とSEHの区別が付かないレベルだろうし
316デフォルトの名無しさん
2022/04/23(土) 23:45:44.58ID:pNqsVcQp decltype(declval<Hoge*>()->*declval<Fuga Hoge::*>)とかすればいいだけじゃないの
というかoperator->*のオーバーロードが絡んでなければ右項のメンバポインタの型から直接取り出せばいいだけじゃないの
何がしたいのか分からない
というかoperator->*のオーバーロードが絡んでなければ右項のメンバポインタの型から直接取り出せばいいだけじゃないの
何がしたいのか分からない
317デフォルトの名無しさん
2022/04/24(日) 06:18:26.42ID:rcB2xidb318デフォルトの名無しさん
2022/04/24(日) 07:34:41.41ID:VMBCaQB9319デフォルトの名無しさん
2022/04/24(日) 07:58:43.35ID:rcB2xidb320デフォルトの名無しさん
2022/04/24(日) 08:09:04.00ID:U2c/5Lvo321デフォルトの名無しさん
2022/04/24(日) 08:14:09.42ID:S9c+iUdl チェックメイトだなw
322デフォルトの名無しさん
2022/04/24(日) 08:24:49.35ID:rcB2xidb323デフォルトの名無しさん
2022/04/24(日) 08:32:41.04ID:8mFtVhHE324デフォルトの名無しさん
2022/04/24(日) 08:44:00.70ID:uNEChMqn もしかして
「__try/__except/__finallyの例外処理=SEHと思っている人」と
「それを実現するために制定されたABIのことをSEHと呼んでそのABIがC++のtry/catchの実装にも応用されていると主張する人」との間で無限に平行線になってるのか
俺は後者のつもりで聞いていたけど前者と考えると、ISO標準例外を使えなんて話が出てくるのも頷ける
「__try/__except/__finallyの例外処理=SEHと思っている人」と
「それを実現するために制定されたABIのことをSEHと呼んでそのABIがC++のtry/catchの実装にも応用されていると主張する人」との間で無限に平行線になってるのか
俺は後者のつもりで聞いていたけど前者と考えると、ISO標準例外を使えなんて話が出てくるのも頷ける
325デフォルトの名無しさん
2022/04/24(日) 08:47:49.34ID:rcB2xidb326デフォルトの名無しさん
2022/04/24(日) 08:49:16.66ID:rcB2xidb327デフォルトの名無しさん
2022/04/24(日) 08:52:40.31ID:uNEChMqn328デフォルトの名無しさん
2022/04/24(日) 08:56:13.74ID:LoCVKuRG 自分の旗色が悪くなったら「話の流れを読め」とか言っちゃう人ですか?
それ物凄く曖昧な定義だね(・∀・)ニヤニヤ
何とでも言えちゃうじゃない
火病を起こした方が負けだよ
それ物凄く曖昧な定義だね(・∀・)ニヤニヤ
何とでも言えちゃうじゃない
火病を起こした方が負けだよ
329デフォルトの名無しさん
2022/04/24(日) 09:02:44.40ID:uNEChMqn330デフォルトの名無しさん
2022/04/24(日) 09:14:26.07ID:rcB2xidb331デフォルトの名無しさん
2022/04/24(日) 09:18:51.38ID:UJYZs/tV332デフォルトの名無しさん
2022/04/24(日) 10:39:09.68ID:JjYc30D0 自分の旗色が悪くなったら「おちょくってやった」とか言っちゃう人ですか?
それ物凄く曖昧な定義だね(・∀・)ニヤニヤ
何とでも言えちゃうじゃない
火病を起こした方が負けだよ
それ物凄く曖昧な定義だね(・∀・)ニヤニヤ
何とでも言えちゃうじゃない
火病を起こした方が負けだよ
333デフォルトの名無しさん
2022/04/24(日) 11:02:54.19ID:UARVLPqL334デフォルトの名無しさん
2022/04/24(日) 11:04:51.34ID:7qMJqWpF >>313
C から踏襲したのだし、 C でそう決めたときに比較できるような「他の言語」なんて無かった。
当時に知られていた比較的近い構造化された文法を持つ言語というと Pascal くらいか。
演算子を分けない選択肢もあったということは今だからわかることなんだよ。
C から踏襲したのだし、 C でそう決めたときに比較できるような「他の言語」なんて無かった。
当時に知られていた比較的近い構造化された文法を持つ言語というと Pascal くらいか。
演算子を分けない選択肢もあったということは今だからわかることなんだよ。
335デフォルトの名無しさん
2022/04/24(日) 11:26:51.18ID:bl0Rasps336デフォルトの名無しさん
2022/04/24(日) 11:31:02.04ID:S9c+iUdl おいおい罵倒語はよせよ
せっかくの勝利を汚すだけだぜ
せっかくの勝利を汚すだけだぜ
337デフォルトの名無しさん
2022/04/24(日) 11:33:38.91ID:S9c+iUdl338デフォルトの名無しさん
2022/04/24(日) 11:45:40.17ID:rcB2xidb339デフォルトの名無しさん
2022/04/24(日) 11:58:32.81ID:0sNKJUFw >>338
もう自分が何を書いているのかも分からないレベルで狂ってますね
もう自分が何を書いているのかも分からないレベルで狂ってますね
340デフォルトの名無しさん
2022/04/24(日) 12:01:55.19ID:sqHO6Ex+ aがポインタアならa[i]は*(a + i)と同じ
b[i][j][k]と書く代わりに *(b + k + _countof(b[0][0]) * j + (_countof(b[0][0]) * _countof(b[0])) * i) と書くことができうる
から[]はポインタアについては無くても良くね
c.dは(&c)->dと同じ
c.d.e.f.g.hと書く代わりは(&(c.d.e.f.g))->hぐらいしか存在しない(d, e, f, g, hは入れ子になった構造体メンバ名
が
c->d->e->f->g->hなら (*((*((*((*((*c).d).e)).f))g)).h と書くことができうる
(d, e, f, g, hは直接的な入れ子ではないが関連を持つ構造体のメンバ名
から->は無くても良くね
以上C/C++における2大無くても良くねなぜ有るんだろう事案
b[i][j][k]と書く代わりに *(b + k + _countof(b[0][0]) * j + (_countof(b[0][0]) * _countof(b[0])) * i) と書くことができうる
から[]はポインタアについては無くても良くね
c.dは(&c)->dと同じ
c.d.e.f.g.hと書く代わりは(&(c.d.e.f.g))->hぐらいしか存在しない(d, e, f, g, hは入れ子になった構造体メンバ名
が
c->d->e->f->g->hなら (*((*((*((*((*c).d).e)).f))g)).h と書くことができうる
(d, e, f, g, hは直接的な入れ子ではないが関連を持つ構造体のメンバ名
から->は無くても良くね
以上C/C++における2大無くても良くねなぜ有るんだろう事案
341デフォルトの名無しさん
2022/04/24(日) 12:09:24.01ID:GIt5p4as 実装が楽だったから
それ以上の理由は考えるだけ無駄だと思うよ
それ以上の理由は考えるだけ無駄だと思うよ
342デフォルトの名無しさん
2022/04/24(日) 12:13:57.09ID:sqHO6Ex+ まつが
えますたorz
誤: c->d->e->f->g->hなら (*((*((*((*((*c).d).e)).f))g)).h と書くことができうる
正: c->d->e->f->g->hなら (*((*((*((*((*c).d)).e)).f))g)).h と書くことができうる
また、c.d.e.f.g.hは(後置演算子が優先度が高いことを利用して極力括弧を無くすとして
&(&(&(&(&c->d)->e)->f)->g)->h
になるかも、、、
えますたorz
誤: c->d->e->f->g->hなら (*((*((*((*((*c).d).e)).f))g)).h と書くことができうる
正: c->d->e->f->g->hなら (*((*((*((*((*c).d)).e)).f))g)).h と書くことができうる
また、c.d.e.f.g.hは(後置演算子が優先度が高いことを利用して極力括弧を無くすとして
&(&(&(&(&c->d)->e)->f)->g)->h
になるかも、、、
343デフォルトの名無しさん
2022/04/24(日) 12:15:41.16ID:0IQhRvgj344デフォルトの名無しさん
2022/04/24(日) 12:17:02.35ID:FAumgQ8n おまえらに規格の話しをしたのが間違いだった
いつの間にかポインタの話になってて笑って草生えそう
いつの間にかポインタの話になってて笑って草生えそう
345デフォルトの名無しさん
2022/04/24(日) 12:19:07.37ID:sqHO6Ex+ イカン駄目かorz
&を->より優先解釈させる必要があるからこうなりそう……
(&((&((&((&((&c)->d))->e))->f))->g))->h
やっぱミニマリスズムを貫くとかえって物量が増える感じに
&を->より優先解釈させる必要があるからこうなりそう……
(&((&((&((&((&c)->d))->e))->f))->g))->h
やっぱミニマリスズムを貫くとかえって物量が増える感じに
346デフォルトの名無しさん
2022/04/24(日) 12:19:14.73ID:6LU2OPGi >>340
そうではなく
ptrが構造体へのポインタの時に
(*ptr).nameと書かなくとも
ptr.nameと書くことにしても型から判断判別可能だから
ptr->nameという記法を用意する必要なかった
って話でしょう
そして短く書けてわかりやすくてオペレータを増やす必要ないメリット
そうではなく
ptrが構造体へのポインタの時に
(*ptr).nameと書かなくとも
ptr.nameと書くことにしても型から判断判別可能だから
ptr->nameという記法を用意する必要なかった
って話でしょう
そして短く書けてわかりやすくてオペレータを増やす必要ないメリット
347デフォルトの名無しさん
2022/04/24(日) 12:25:11.79ID:sqHO6Ex+ c.d.e.f.g.h
が旧来のC++で言うところの
c.d.e.f.g.h
c.d.e.f.g->h
c.d.e.f->g.h
c.d.e.f->g->h
c.d.e->f.g.h
...
c->d->e->f->g->h
(計2^5通り)のどれな意味のかが暗黙になって機械任せになってしまったら
コードを書く方も読む方も疲弊して転職しちゃいそう……
が旧来のC++で言うところの
c.d.e.f.g.h
c.d.e.f.g->h
c.d.e.f->g.h
c.d.e.f->g->h
c.d.e->f.g.h
...
c->d->e->f->g->h
(計2^5通り)のどれな意味のかが暗黙になって機械任せになってしまったら
コードを書く方も読む方も疲弊して転職しちゃいそう……
348デフォルトの名無しさん
2022/04/24(日) 12:31:08.83ID:S3EB6hln >>312の話ですね
戻しましょうか
戻しましょうか
349デフォルトの名無しさん
2022/04/24(日) 12:37:13.82ID:owNaeWLI350デフォルトの名無しさん
2022/04/24(日) 12:57:12.43ID:sqHO6Ex+ まあPerlだと確かに$a->[$i]は${$a}[$i]と全く同じ意味なので$記法だけで困らないが
C/C++だと違うやんけ「.」と「->」に言語の存在意義レベルで重要な違いが生じているやんけ、
C/C++だと違うやんけ「.」と「->」に言語の存在意義レベルで重要な違いが生じているやんけ、
351デフォルトの名無しさん
2022/04/24(日) 13:04:18.44ID:grh6oY7G perlに限らずほぼ全てのプログラミング言語でxがポインタの時もx.yと記述
ポインタか否かは自明なのだからx->y記述は不要
ポインタか否かは自明なのだからx->y記述は不要
352デフォルトの名無しさん
2022/04/24(日) 13:09:38.20ID:rPlVOsWU 歴史的経緯でそうなった以上の理由はなさそう
353デフォルトの名無しさん
2022/04/24(日) 13:13:17.04ID:Kb2VRi8y SEHの話はどうなったん?
納得行ってくれたん?
納得行ってくれたん?
354デフォルトの名無しさん
2022/04/24(日) 13:33:09.07ID:7qMJqWpF >>353
どうでもいい話だから流しておけばいいんだよ。
どうでもいい話だから流しておけばいいんだよ。
355デフォルトの名無しさん
2022/04/24(日) 13:43:07.35ID:bl0Rasps >>349
型推論とか導入したくなったときにこまりそう
型推論とか導入したくなったときにこまりそう
356デフォルトの名無しさん
2022/04/24(日) 13:43:26.65ID:DUFf34zT まとめ
・SEHはMicrosoftによるC言語に対する拡張機能で例外を扱えるようにする
・C++には例外機構があるためSEHを使う必要はなくMicrosoftもそう推奨
・当然ほぼ同じ仕組みなので両方サポートするコンパイラは一部を共有しうる
結論
「C++例外とSEHは同じレベルで異なるものであるため、片方を使って別の片方を実装することは有り得ない」
・SEHはMicrosoftによるC言語に対する拡張機能で例外を扱えるようにする
・C++には例外機構があるためSEHを使う必要はなくMicrosoftもそう推奨
・当然ほぼ同じ仕組みなので両方サポートするコンパイラは一部を共有しうる
結論
「C++例外とSEHは同じレベルで異なるものであるため、片方を使って別の片方を実装することは有り得ない」
357デフォルトの名無しさん
2022/04/24(日) 13:52:38.36ID:fO0RhYFQ ということにしたいのですね。
358デフォルトの名無しさん
2022/04/24(日) 14:37:26.25ID:GcKW+309 結局実装の話しをせずにはおれんのだよなあ
359蟻人間 ◆T6xkBnTXz7B0
2022/04/24(日) 14:46:41.37ID:0sr3C4Gh SEHはアセンブリ・機械語レベルでも定義されている。
C++コンパイラ側でSEHのアセンブリを埋め込むことも可能。
C++コンパイラ側でSEHのアセンブリを埋め込むことも可能。
360デフォルトの名無しさん
2022/04/24(日) 14:53:29.69ID:hfCsztEI 論点すり替えのゴリホーモきっしょ
361蟻人間 ◆T6xkBnTXz7B0
2022/04/24(日) 14:59:44.05ID:0sr3C4Gh 【確認方法】
1. MinGW-w64からx86_64-8.1.0-release-posix-seh-rt_v6-rev0.7zをダウンロードする。
2. 7-Zipを使ってx86_64-8.1.0-release-posix-seh-rt_v6-rev0.7zを展開。
3. mingw64\binフォルダで次のような内容のa.cppを作成する。
#include <stdio.h>
int *f(void) { return NULL; }
int main(void) {
try {
throw f();
} catch (...) {
printf("OK\n");
}
return 0;
}
4. 「g++ -S -O0 a.cpp -o a.asm」を実行する。
5. ファイル「a.asm」が吐き出されている。
ファイル内容は「.seh_setframe」「.seh_endprologue」「__gxx_personality_seh0」などの文字列を含んでいる。
6. gccのソースを検索すると「gxx_personality_seh0」という関数がSEHで実装されているのが確認できる。
https://github.com/gcc-mirror/gcc/blob/16e2427f50c208dfe07d07f18009969502c25dc8/libstdc%2B%2B-v3/libsupc%2B%2B/eh_personality.cc#L804
https://github.com/gcc-mirror/gcc/blob/16e2427f50c208dfe07d07f18009969502c25dc8/libstdc%2B%2B-v3/libsupc%2B%2B/eh_personality.cc#L355
1. MinGW-w64からx86_64-8.1.0-release-posix-seh-rt_v6-rev0.7zをダウンロードする。
2. 7-Zipを使ってx86_64-8.1.0-release-posix-seh-rt_v6-rev0.7zを展開。
3. mingw64\binフォルダで次のような内容のa.cppを作成する。
#include <stdio.h>
int *f(void) { return NULL; }
int main(void) {
try {
throw f();
} catch (...) {
printf("OK\n");
}
return 0;
}
4. 「g++ -S -O0 a.cpp -o a.asm」を実行する。
5. ファイル「a.asm」が吐き出されている。
ファイル内容は「.seh_setframe」「.seh_endprologue」「__gxx_personality_seh0」などの文字列を含んでいる。
6. gccのソースを検索すると「gxx_personality_seh0」という関数がSEHで実装されているのが確認できる。
https://github.com/gcc-mirror/gcc/blob/16e2427f50c208dfe07d07f18009969502c25dc8/libstdc%2B%2B-v3/libsupc%2B%2B/eh_personality.cc#L804
https://github.com/gcc-mirror/gcc/blob/16e2427f50c208dfe07d07f18009969502c25dc8/libstdc%2B%2B-v3/libsupc%2B%2B/eh_personality.cc#L355
362デフォルトの名無しさん
2022/04/24(日) 15:10:50.52ID:6P7FGMNI それは違うな
まずC++の例外のセマンティクスは定まっており実装はそれを厳守せねばならない
次にSEHのセマンティクスはC++の例外とは微妙に異なる
したがってC++の例外をSEHで実装するのは不可能
ただし実装コードの一部共有は可能
その一部共有コードの出自がSEHであればsehと名の付くものが存在しても構わない
しかしそれを持ってC++の例外がSEHで実装されているとは言わない
この点を明確に区別できない人はヤバい
まずC++の例外のセマンティクスは定まっており実装はそれを厳守せねばならない
次にSEHのセマンティクスはC++の例外とは微妙に異なる
したがってC++の例外をSEHで実装するのは不可能
ただし実装コードの一部共有は可能
その一部共有コードの出自がSEHであればsehと名の付くものが存在しても構わない
しかしそれを持ってC++の例外がSEHで実装されているとは言わない
この点を明確に区別できない人はヤバい
364デフォルトの名無しさん
2022/04/24(日) 15:19:08.93ID:bl0Rasps365デフォルトの名無しさん
2022/04/24(日) 15:19:51.72ID:DF/Hs/9f レイヤーが明白に異なるね
SEHでC++の例外を実装したとは言わない
C++の例外にも適用できるように拡張したアセンブリコードを共有しただけだね
これは逆の視点でも捉えることができて元々C++例外のみ対応をSEHの例外にも適用できるように拡張したアセンブリコードを共有しても同じこと
SEHでC++の例外を実装したとは言わない
C++の例外にも適用できるように拡張したアセンブリコードを共有しただけだね
これは逆の視点でも捉えることができて元々C++例外のみ対応をSEHの例外にも適用できるように拡張したアセンブリコードを共有しても同じこと
366ハノン ◆QZaw55cn4c
2022/04/24(日) 15:20:22.47ID:pSkiKAbi367蟻人間 ◆T6xkBnTXz7B0
2022/04/24(日) 15:25:25.72ID:gt27lZWI アセンブリレベルでC++のセマンティクスを維持しているとは考えにくい。
368蟻人間 ◆T6xkBnTXz7B0
2022/04/24(日) 15:27:30.57ID:gt27lZWI 例え違うとしてもその違う部分をカバーするコードを追加すれば実装できる。
369デフォルトの名無しさん
2022/04/24(日) 15:28:20.50ID:rcB2xidb370デフォルトの名無しさん
2022/04/24(日) 15:29:04.49ID:FdEGTHTh371蟻人間 ◆T6xkBnTXz7B0
2022/04/24(日) 15:31:58.61ID:gt27lZWI372蟻人間 ◆T6xkBnTXz7B0
2022/04/24(日) 15:36:02.53ID:gt27lZWI >>371
そして、データはGetExceptionInformation()関数で受け取れるよ。
そして、データはGetExceptionInformation()関数で受け取れるよ。
373デフォルトの名無しさん
2022/04/24(日) 15:41:20.57ID:1MdKUkTK >>369
マイクロソフト公式でSEHとC++例外の違いがはっきり書いてある
C++例外対応へ拡張しない限り、SEHでC++例外を実装することは不可能
https://docs.microsoft.com/ja-jp/cpp/cpp/exception-handling-differences
C構造化例外処理(SEH)とC++例外処理との主な相違点は、C++例外処理モデルが複数の型を取り扱うのに対し、C構造化例外処理(SEH)モデルは 1 つの型 (特に、unsigned int) の例外を取り扱うことです。
>>370
それはC++例外に対応するための拡張
元のSEH自体は上記マイクロソフト公式にある通り
マイクロソフト公式でSEHとC++例外の違いがはっきり書いてある
C++例外対応へ拡張しない限り、SEHでC++例外を実装することは不可能
https://docs.microsoft.com/ja-jp/cpp/cpp/exception-handling-differences
C構造化例外処理(SEH)とC++例外処理との主な相違点は、C++例外処理モデルが複数の型を取り扱うのに対し、C構造化例外処理(SEH)モデルは 1 つの型 (特に、unsigned int) の例外を取り扱うことです。
>>370
それはC++例外に対応するための拡張
元のSEH自体は上記マイクロソフト公式にある通り
374蟻人間 ◆T6xkBnTXz7B0
2022/04/24(日) 15:59:06.18ID:gt27lZWI 足し算と掛け算のセマンティクスが違うとしても、足し算の繰り返しで掛け算を実装できるぜ。アホか。
375デフォルトの名無しさん
2022/04/24(日) 16:12:31.33ID:rWBP/Ftg376デフォルトの名無しさん
2022/04/24(日) 16:21:05.86ID:CQzQflDH■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【国民民主】支持率下落に危機感…山尾氏ら擁立にSNS「変な流れになってきた」 [蚤の市★]
- 「san呼び」世界に広がるか 「性別肩書、問わず便利」 [香味焙煎★]
- 【神奈川】日産城下町がゴーストタウンになりかねない 「工場閉鎖」で大揺れの横須賀・追浜 商店街からは祈るような声が ★2 [ぐれ★]
- 女性39歳、貯金200万円。毎月手取り19万、ボーナスは年50万。身内が全員死去しており、遺産はありません。今後どう生きていくべきか ★2 [お断り★]
- 【料理】浴槽の次は「コンロキャンセル界隈」 20代は4割、調理家電で十分 ]2 [ぐれ★]
- 【空が黒く染まった!】大阪万博 ユスリカ大量発生を徹底検証…根本原因は鳥が消えた“環境破壊”3年前の警告が現実に ★2 [ぐれ★]
- 【悲報】VIP、糞スレしかない
- 【ホラッチョ速報】トランプ「株価下がったんでEUへの50%関税、7月9日までの延期するよ!」 [733893279]
- トランプ一族の経営企業が絶好調! 安倍晋三 [402859164]
- 【速報】トランプ、EU関税延期WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
- (ヽ゚ん゚)「胸のでかい絵は女性蔑視。胸のでかい絵は人権侵害。胸のでかい絵に寛容だったらリベラルじゃねえんだよ」 [932029429]
- 【悲報】米国人「おやびん、話が違う・・・」米国人の過半数がトランプ関税のせいで家計悪化したと回答 [733893279]