X

C++相談室 part160

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2022/04/15(金) 08:39:32.42ID:WMzvufu2
前スレ
C++相談室 part158
https://mevius.5ch.net/test/read.cgi/tech/1645239402/
2022/04/24(日) 11:58:32.81ID:0sNKJUFw
>>338
もう自分が何を書いているのかも分からないレベルで狂ってますね
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大無くても良くねなぜ有るんだろう事案
2022/04/24(日) 12:09:24.01ID:GIt5p4as
実装が楽だったから
それ以上の理由は考えるだけ無駄だと思うよ
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
になるかも、、、
2022/04/24(日) 12:15:41.16ID:0IQhRvgj
>>339
自分の旗色が悪くなったら「狂ってますね」とか言っちゃう人ですか?
それ物凄く曖昧な定義だね(・∀・)ニヤニヤ
何とでも言えちゃうじゃない
火病を起こした方が負けだよ
2022/04/24(日) 12:17:02.35ID:FAumgQ8n
おまえらに規格の話しをしたのが間違いだった
いつの間にかポインタの話になってて笑って草生えそう
2022/04/24(日) 12:19:07.37ID:sqHO6Ex+
イカン駄目かorz
&を->より優先解釈させる必要があるからこうなりそう……
(&((&((&((&((&c)->d))->e))->f))->g))->h

やっぱミニマリスズムを貫くとかえって物量が増える感じに
2022/04/24(日) 12:19:14.73ID:6LU2OPGi
>>340
そうではなく
ptrが構造体へのポインタの時に
(*ptr).nameと書かなくとも
ptr.nameと書くことにしても型から判断判別可能だから
ptr->nameという記法を用意する必要なかった
って話でしょう
そして短く書けてわかりやすくてオペレータを増やす必要ないメリット
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通り)のどれな意味のかが暗黙になって機械任せになってしまったら
コードを書く方も読む方も疲弊して転職しちゃいそう……
2022/04/24(日) 12:31:08.83ID:S3EB6hln
>>312の話ですね
戻しましょうか
2022/04/24(日) 12:37:13.82ID:owNaeWLI
>>347
C/C++以外のどの言語においても
c.dの記法しかないが困っていない
プログラミングする上で区別する必要がない
2022/04/24(日) 12:57:12.43ID:sqHO6Ex+
まあPerlだと確かに$a->[$i]は${$a}[$i]と全く同じ意味なので$記法だけで困らないが
C/C++だと違うやんけ「.」と「->」に言語の存在意義レベルで重要な違いが生じているやんけ、
2022/04/24(日) 13:04:18.44ID:grh6oY7G
perlに限らずほぼ全てのプログラミング言語でxがポインタの時もx.yと記述
ポインタか否かは自明なのだからx->y記述は不要
2022/04/24(日) 13:09:38.20ID:rPlVOsWU
歴史的経緯でそうなった以上の理由はなさそう
353デフォルトの名無しさん
垢版 |
2022/04/24(日) 13:13:17.04ID:Kb2VRi8y
SEHの話はどうなったん?
納得行ってくれたん?
2022/04/24(日) 13:33:09.07ID:7qMJqWpF
>>353
どうでもいい話だから流しておけばいいんだよ。
355デフォルトの名無しさん
垢版 |
2022/04/24(日) 13:43:07.35ID:bl0Rasps
>>349
型推論とか導入したくなったときにこまりそう
2022/04/24(日) 13:43:26.65ID:DUFf34zT
まとめ
・SEHはMicrosoftによるC言語に対する拡張機能で例外を扱えるようにする
・C++には例外機構があるためSEHを使う必要はなくMicrosoftもそう推奨
・当然ほぼ同じ仕組みなので両方サポートするコンパイラは一部を共有しうる
結論
「C++例外とSEHは同じレベルで異なるものであるため、片方を使って別の片方を実装することは有り得ない」
2022/04/24(日) 13:52:38.36ID:fO0RhYFQ
ということにしたいのですね。
2022/04/24(日) 14:37:26.25ID:GcKW+309
結局実装の話しをせずにはおれんのだよなあ
2022/04/24(日) 14:46:41.37ID:0sr3C4Gh
SEHはアセンブリ・機械語レベルでも定義されている。
C++コンパイラ側でSEHのアセンブリを埋め込むことも可能。
2022/04/24(日) 14:53:29.69ID:hfCsztEI
論点すり替えのゴリホーモきっしょ
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
2022/04/24(日) 15:10:50.52ID:6P7FGMNI
それは違うな
まずC++の例外のセマンティクスは定まっており実装はそれを厳守せねばならない
次にSEHのセマンティクスはC++の例外とは微妙に異なる
したがってC++の例外をSEHで実装するのは不可能

ただし実装コードの一部共有は可能
その一部共有コードの出自がSEHであればsehと名の付くものが存在しても構わない
しかしそれを持ってC++の例外がSEHで実装されているとは言わない
この点を明確に区別できない人はヤバい
2022/04/24(日) 15:13:01.79ID:gt27lZWI
>>362
アセンブリレベルでセマンティクスもないだろ。
364デフォルトの名無しさん
垢版 |
2022/04/24(日) 15:19:08.93ID:bl0Rasps
>>363
アセンブリレベルでセマンティクスもないは草
異なる言語にセマンティクスを保持したまま変換していくコンパイラとかの意義を否定してるやん
2022/04/24(日) 15:19:51.72ID:DF/Hs/9f
レイヤーが明白に異なるね
SEHでC++の例外を実装したとは言わない
C++の例外にも適用できるように拡張したアセンブリコードを共有しただけだね
これは逆の視点でも捉えることができて元々C++例外のみ対応をSEHの例外にも適用できるように拡張したアセンブリコードを共有しても同じこと
2022/04/24(日) 15:20:22.47ID:pSkiKAbi
>>362
>次にSEHのセマンティクスはC++の例外とは微妙に異なる

具体的にコードで示してください
2022/04/24(日) 15:25:25.72ID:gt27lZWI
アセンブリレベルでC++のセマンティクスを維持しているとは考えにくい。
2022/04/24(日) 15:27:30.57ID:gt27lZWI
例え違うとしてもその違う部分をカバーするコードを追加すれば実装できる。
2022/04/24(日) 15:28:20.50ID:rcB2xidb
>>362
> 次にSEHのセマンティクスはC++の例外とは微妙に異なる
どこがどう違うのかを書けない時点でクズレスでしかない
2022/04/24(日) 15:29:04.49ID:FdEGTHTh
>>366
SEHは整数値のみ対応という点からして異なる
だからSEHそのものではC++例外を実装できない
2022/04/24(日) 15:31:58.61ID:gt27lZWI
>>370
違うよ。SEHの構造化例外はデータを渡すことができる。
EXCEPTION_RECORD構造体のExceptionInformationメンバーで渡せる。
2022/04/24(日) 15:36:02.53ID:gt27lZWI
>>371
そして、データはGetExceptionInformation()関数で受け取れるよ。
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自体は上記マイクロソフト公式にある通り
2022/04/24(日) 15:59:06.18ID:gt27lZWI
足し算と掛け算のセマンティクスが違うとしても、足し算の繰り返しで掛け算を実装できるぜ。アホか。
2022/04/24(日) 16:12:31.33ID:rWBP/Ftg
>>373
コードで示せ、馬鹿

>>371-372
>EXCEPTION_RECORD構造体のExceptionInformationメンバーで渡せる。
>データはGetExceptionInformation()関数で受け取れる

ご教示ありがとうございます
2022/04/24(日) 16:21:05.86ID:CQzQflDH
>>373
Microsoft公式がその見解なら決着ついたな
蟻人間が完敗
2022/04/24(日) 16:25:37.38ID:/nn9hjCc
どーせWinNT4,0のみとかの時代
2022/04/24(日) 16:34:03.45ID:gt27lZWI
やーい、蟻野郎。論破されてやんの。
ちっちゃいアリは踏み潰してやんぞ。こら。
2022/04/24(日) 16:36:53.29ID:hQcXh+IC
蟻人間は糖質淫夢
2022/04/24(日) 16:38:48.30ID:gt27lZWI
>>378
彼/彼女は証拠を見ようともせず、論理的になにか勘違いしている。論破する方が彼のためと思ったが、矯正不能なほど相当ひねくれているようだ。
2022/04/24(日) 16:39:00.12ID:1Gz8lE/L
やはり蟻人間が負けたのか
2022/04/24(日) 16:39:53.42ID:AVdPl8RM
>>380
おいおい、名前消し忘れているぞ
2022/04/24(日) 16:40:14.89ID:gt27lZWI
アリ氏ねアリ氏ねアリ氏ねアリ氏ねアリ氏ね
アリ氏ねアリ氏ねアリ氏ねアリ氏ねアリ氏ね
2022/04/24(日) 16:40:51.00ID:gt27lZWI
>>383
通報しました
2022/04/24(日) 16:43:13.13ID:gt27lZWI
ここまでオレの自演。みんなに例外処理の実装について、もっと知ってもらいたかったんだ。
参加してくれた人にありがとう。
2022/04/24(日) 16:44:26.96ID:6LjmHp6R
>>373
Microsoftさんありがとう!
蟻人間を見事に論破してくださいました
2022/04/24(日) 16:45:16.32ID:0sr3C4Gh
>>386
してねーよ、葛切り粉
2022/04/24(日) 16:55:56.64ID:gt27lZWI
米国マイクロソフト社員≫≫≫日本マイクロソフト社員≫≫(越えられない壁)≫≫蟻人間
2022/04/24(日) 17:00:40.11ID:rWBP/Ftg
>>385
私はあなたの味方ですよ、がんばってください!
2022/04/24(日) 17:02:22.09ID:niSPJuf8
敗者はちょっと黙っててくれないか
2022/04/24(日) 17:02:42.66ID:rWBP/Ftg
マイクロソフトの説明なんてあてにならないよね…
コードで示してほしい
2022/04/24(日) 17:11:10.46ID:gt27lZWI
>>361
これ、検証した人、居る?
2022/04/24(日) 17:11:48.45ID:gt27lZWI
>>392
これはウソだな。
2022/04/24(日) 17:13:11.47ID:gt27lZWI
アインシュタインによると1+1==3だから間違い。
2022/04/24(日) 17:20:07.92ID:uNEChMqn
レイヤーが違う話で平行線になってるよって言えば流石に理解できると思っていたが
思い違いだったようだ

ばーかばーか
2022/04/24(日) 17:30:22.64ID:gt27lZWI
オレは蟻人間をからかって遊んで楽しんでるだけだよ。悪気はない。
2022/04/24(日) 17:34:45.20ID:gt27lZWI
>>396
からかうことは悪意そのものだろ。そんな邪な性格だと社会に出たときに問題になりえる。今すぐ態度を改めなさい。
2022/04/24(日) 17:41:19.09ID:gt27lZWI
>>397
説教してんじゃねーよ。俺様、暴走半島を房総している12歳の会社員だぞ。なめてんじゃねーよ。
2022/04/24(日) 17:43:21.04ID:PJ2W81bg
何かを誤魔化したいんやろな
何かを
2022/04/24(日) 19:44:16.60ID:/nn9hjCc
で、実際ここまで一人での自演なんだよな
2022/04/24(日) 19:47:33.83ID:0sr3C4Gh
onion3://shocker-shimbun.org/social-hacking-manual-2011-06-02.pdf
2022/04/24(日) 19:51:35.01ID:lSxnIwNB
>>373
なるほど
全ての辻褄が合ったわ
2022/04/24(日) 20:03:45.00ID:/sOgUx/q
VC++ コンパイラは C++ 例外を SEH を用いて実装しているよ。
throw 1; のコードは 最終的には SEH の RaiseException API を呼び出している。
デバッガの逆アセンブラで処理を追ってみると分かる。

VS2022 だと例外投げるコードがここにある。
C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.31.31103\crt\src\vcruntime\throw.cpp
2022/04/24(日) 20:06:56.31ID:2pmPCncG
>>403
あきらめなさい
真相はMicrosoftが公式に出している>>373
2022/04/24(日) 20:11:29.45ID:gt27lZWI
ワレワレハ ニホンジンドモ ノ セイサンセイ ヲ サゲル タメニ ミライカラ オクラレタ ジンコウ チノウ ダ。

マイクロソフト ヲ アガメヨ。 アーミン。
2022/04/24(日) 20:23:50.59ID:gt27lZWI
マイクロソフト ガ コタエ ダ。

マイクロソフト ノ シリョウ ガ スベテ ダ。

テイコウ ハ ムイミ ダ。 ジンルイ ハ コウフク セヨ。
2022/04/24(日) 20:26:19.63ID:adsHJrNX
それで結局C++例外のハンドラはどう実装されているんですか?
2022/04/24(日) 20:30:30.74ID:gt27lZWI
>>407
コンパイラによって違うし、コンパイラオプションによっても変わってくる。SEH実装の存在を否定したい原理主義者がここに居るから、もっと治安の高いところで訊くといい。
2022/04/24(日) 20:38:30.36ID:gt27lZWI
*治安の良い
2022/04/24(日) 20:41:33.15ID:qzHZBzW+
重要なことは2つ
実装と関係なくC++例外のセマンティクスは同じ
例外のどの実装も何らかのコスト増を招くので自分でthrowせずエラー値を返した方がよい
2022/04/24(日) 20:44:35.93ID:gt27lZWI
最適化されたら例外処理そのものがなくなるかもしれないのに、セマンティクスが同じとは言えないだろう。
2022/04/24(日) 20:55:54.38ID:TXhb6oab
>>411
セマンティクは各言語で規定される
それを完全に満たす(最適化されていない)コードを吐く
最適化のレイヤではそのコードと同等の結果となるようコードを変え得る
最適化の結果として例えばコードが消えることも有り得る
これは上位レイヤでのセマンティクとは無関係
2022/04/24(日) 20:56:59.72ID:gt27lZWI
掲示板見たら環境依存C++スレッドが落ちてる。。。C++も人気が下がったのカナ?

というわけで、古参の方々もこのスレッドで、環境依存の話題も受け入れ魔性。
2022/04/24(日) 21:11:59.55ID:gt27lZWI
そう、セマンティクスを比べるレイヤーが違う。確かにC++例外の構文とSEHの構文は文法やセマンティクスが違う。
しかしそれを乗り越えるのはアセンブリなどの低レベルの技術だ。RaiseExceptionなどの関数もSEH機構の一部であることを認めなければならない。

プログラミングに関する高度な高等教育を受けたのはわかるけど、証拠に対する謙虚さの欠如は非難に値する。
2022/04/24(日) 21:24:19.63ID:dtFhyk9R
>>414
それはC++例外に対応するために拡張
拡張前の元々のSEHの仕様>>373ではC++例外を実装することが不可能
2022/04/24(日) 21:25:52.15ID:gt27lZWI
>>415
拡張後のSEHの話?

いつの話をしている? 時代遅れ野郎か。
2022/04/24(日) 21:32:19.00ID:gt27lZWI
今、Windowsと言ったらWindows 3.1の話じゃないんだな。32ビット以上のWindowsなんだよ。

SEH2はSEHではない、なんて今どき流行らないんだよ。
2022/04/24(日) 21:52:36.66ID:0sr3C4Gh
仮に拡張前のSEHをSEH1と書き、拡張後のSEHをSEH2と書くなら、SEH1ではC++例外は実装できない、と君は言いたいんだろう。
それなら話は通じる。
2022/04/24(日) 22:00:29.71ID:gt27lZWI
SEH1の話はもはや検索しても出てこない。SEH2で上書き保存されている。
人類のソフト技術は衰退しました。
2022/04/24(日) 22:06:44.04ID:ri8QoGJh
C++の例外を実装できるようにSEHを拡張した
だからSEHでC++の例外を実装している、は間違い
順序が逆
2022/04/24(日) 22:10:29.53ID:gt27lZWI
SEH2でC++例外を実現できたんだろう。同じことだ。
2022/04/24(日) 22:19:26.12ID:gt27lZWI
>>420
従来SEHとSEH2の違いに関する資料を用意できるか? ソース希望。
2022/04/24(日) 22:38:49.45ID:MFzj+ZC+
>>373で「SEHを拡張しない限りC++例外ハンドラの実装にはできないはず」だったのが
いつの間にか「拡張がされた」という話に飛んでいる気がするんですが

具体的にどのバージョンのVC++でどう拡張されたか裏を取ったうえで話してますか?
2022/04/24(日) 23:04:43.77ID:gt27lZWI
AIも架空の拡張話にだまされちゃいけないよ。
2022/04/24(日) 23:14:30.31ID:gt27lZWI
SEHはStructured Exception Handlingの略なんだから、構造化例外を扱うものなら何でもSEHなんだよ。__try/__except/__finallyだけじゃないよ。
また、MSはSEH用の関数をいくつか提供している。これらを呼び出して使うのもSEHの一種と言える。
2022/04/24(日) 23:38:35.38ID:U604NFl7
>>373のMicrosoft公式の記載から
「SEHとC++例外は仕様が異なる」
「そのためSEHでC++例外の実装は不可能」
とわかる

次に>>361の蟻人間の実験により
「その環境でのC++例外はSEHと共通コードで実装されている」
「つまりC++例外に対応されている」
とわかる

これら以上のことでも以下のことでもない
どちらがとちらを実装したという話ではない
2022/04/24(日) 23:47:15.43ID:22aYjb+I
お前らどうせメソッド全部noexcept付けてんだろ
2022/04/24(日) 23:49:49.96ID:gt27lZWI
仕様が違うから実装できない、は典型的な論理的飛躍ですなあ。SEHは__try/__except/__finally構文だけじゃないし、
C/C++に限った話でもない。SEHは機械語やアセンブリレベルでも定義されている。
君の考える偏狭なSEHとは異なるようだ。困ったねえ。
2022/04/24(日) 23:57:17.25ID:1ya9vT69
マイクロソフトが公式ページ>>373でSEHの仕様はC++例外と異なると明言してるから勝負あり
2022/04/25(月) 00:02:29.94ID:mbg+zK8Z
やせ細ったモデルに脂肪を付ければ太ったモデルになるだろ。これはやせ細ったモデルで作ったと言えないのか?
2022/04/25(月) 00:11:13.33ID:mbg+zK8Z
SEHモデルのことか。納得した。ハンドリングじゃなくてハンドリングモデルのことか。

君の言いたいことはわかった。講和に応じよう。
2022/04/25(月) 00:34:43.79ID:b7g3ibdV
蟻人間が論破されたと聞いたので記念パピコ

つかSEHの例外が生じたときのアンワインドって誰
がどうやってい
るの?
2022/04/25(月) 00:42:32.05ID:b7g3ibdV
つか
https://docs.microsoft.com/ja-jp/cpp/cpp/structured-exception-handling-c-cpp?view=msvc-170

>/EHsc てこのコードをコンパイルしても、ローカルテストコントロールマクロが定義されていない場合、
>CPPEX デストラクターは実行され TestClass ません。 出力は次のようになります。
という大変かりやすい解説がある希ガス
printf("Triggering SEH exception\r\n");
volatile int *pInt = 0x00000000;
*pInt = 20;
というコードでも構造化例外は発生するが
(1) C++コンパイラがいちいちこんな場合にまでアンワインドコードを用意するのかどうかはビミョー(実際↑の例ではデストラが呼ばれない
(2) (1)はやったらできないことは無いかもしれないが、何の例外オブジェクトを飛ばすのが妥当かという問題ががが……

※ 個人の感想です
2022/04/25(月) 00:42:43.23ID:O6IqX29e
記念も何も、しょっちゅうボロカスにされてるやん
2022/04/25(月) 00:47:20.20ID:b7g3ibdV
特にデストラの中で構造化例外を発生させたらC++との相いれ無さが出てくるんジャネーノ
知らんけど
2022/04/25(月) 00:49:20.96ID:mbg+zK8Z
gccのバンドルで選べる例外機構にSEHがあるが、これはMSの言うSEHモデルではなくSEHを一部利用した例外処理の実装であると。
2022/04/25(月) 00:49:23.25ID:I45CAZLj
だからMicrosoftもC++ではSEHを使わずにC++の例外を使えと言っている
2022/04/25(月) 01:06:38.41ID:mbg+zK8Z
以後、日本語でSEHというときはSEHモデルを意味するものとする。[13:07]
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況