C++相談室 part147

■ このスレッドは過去ログ倉庫に格納されています
2019/12/18(水) 17:56:53.03ID:uFDqtnkl
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part146
https://mevius.5ch.net/test/read.cgi/tech/1573094136/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
http://mevius.5ch.net/test/read.cgi/tech/1556142878/

■長いソースを貼るときはここへ。■
 http://codepad.org/
 https://ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)

STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

↑え?だってお前、普通ダイナミックリンクするだろ?
"ダイナミックリンク"す・れ・ば、ファイルサイズ**増えないです**
2020/01/18(土) 21:23:34.49ID:Upzp+V6z
↓do { } while(0)でこれできたっけ?
if (cond) { goto label1; }
 do {
  処理A
label1:
  処理B
 } while (0);

YES! gotoならできる!!
 if (cond) { goto label1; }
label2:
 処理A
label1:
 処理B
 goto label2;
2020/01/18(土) 21:28:09.90ID:Upzp+V6z
つか
do {
 処理A;
 if (cond) { break; }
 処理B;
 std::unique_ptr p(new Foo());
 処理C; // pを使用
} while (0);

みたいな腐り切った腐敗臭しかしないコードを書くぐらいなら
 std::unique_ptr p;
 {
  処理A;
  if (cond) { goto last; }
  処理B;
  p = std::unique_ptr(new Foo());
  処理C; // pを使用
 }
last:
 ;
と書くわ

Perl風に
2020/01/18(土) 21:30:23.35ID:v/DZPeDP
>>314
そんなことはお前ともう1名ほど除いて皆わかってる
そうじゃなくて特定の条件で早期に開放したい場合にどうするかだよ

>>315
味方が現れてウレションかよw
2020/01/18(土) 21:30:23.45ID:cLOUBKze
ID:0qsbj5e出てこいオラ
2020/01/18(土) 21:34:58.69ID:cLOUBKze
ID:0qsbj5e6 出てこい
2020/01/18(土) 21:42:46.68ID:65HS6FKB
>>318
auto v = std::make_unique<std::vector<Hoge>>(...);
...
if(特定条件){
v.reset();
}

これだけの話では?
2020/01/18(土) 21:45:43.25ID:cLOUBKze
そうそう
兆くだらねえ話だ(わざと誤字
2020/01/18(土) 21:47:11.24ID:cLOUBKze
goto過敏症のアホどもが少しでも目を醒ましてくれるといいな
2020/01/18(土) 21:49:54.58ID:v/DZPeDP
>>273
から読み直して
空moveが確実だけど質問者がそれを場当たり的と生意気言ったことから話が盛り上がるw
2020/01/18(土) 21:51:28.17ID:v/DZPeDP
>>323
この場合gotoは何の解にもなっていないことにそろそろ気づいた方がいいよ
2020/01/18(土) 21:53:26.94ID:v/DZPeDP
>>321
>>324 を読んでね
2020/01/18(土) 21:59:36.19ID:0qsbj5e6
RAII対応してないから無理矢理goto出来るようにした糞コード上げられてもああ糞ですねと言うしかないんだが。
内部が複雑になってきたらその度にブロック外に変数追加して、変数の内容の初期化は必要に応じてって書き方を続けるつもりなんかね
2020/01/18(土) 22:27:52.30ID:cLOUBKze
>>325
gotoが何かの解になったらいいの?wwwwwwww
2020/01/18(土) 22:28:06.88ID:4nVoSga0
>>304
そうなんだっけ?
2020/01/19(日) 00:26:12.30ID:M/ehGL7C
やっぱこういうコードは一度書いてみたいよな
try {
label:
 何かの処理;
} catch (Exception ex) {
 goto label;
}
2020/01/19(日) 00:32:09.37ID:M/ehGL7C
gotoを使うと糞、と言う香具師は多いが
goto以外の構文も大概なことがある
↓これとか

EnterCriticalSection(&csec);
{
 if (エラー条件成立) {
  LeaveCriticalSection(&csec);
  throw "*** ERR ***";
 }
 何かの処理; 
}
LeaveCriticalSection(&csec);

一体どうすれば…orz
2020/01/19(日) 00:36:14.30ID:M/ehGL7C
いやまあテストラクトされるときにLeaveCriticalSection()するような
AutoLockオブジェクトを使えば済むっていやー済むが
裏返せばgoto以外の構文も糞製造機であることにはかわりわない!
2020/01/19(日) 00:38:55.96ID:ocqIlbpk
それは構文が糞なんじゃなくてリソース管理が糞なだけ
2020/01/19(日) 01:24:22.15ID:PgEzQeWd
auto lockなんてむしろ使ってなかったらPRでリジェクトされる
2020/01/19(日) 06:28:34.04ID:6oeBvQPN
gotoの何が悪いのかを端的に表すたった一言が出てこない教条主義は物笑いの種
2020/01/19(日) 07:19:17.26ID:M/ehGL7C
誰にも迷惑がかからないgotoの例:

 for (a = 0; a < 2; a++) {
  for (b = 0; b < 2; b++) {
   for (c = 0; c < 2; c++) {
    ....
     for (zaaa = 0; zaaa < 2; zaaa++) {
      処理A
      if (何かの条件) { goto last; }
      処理B
     }
    ...
   }
  }
 }
last:
 ;
2020/01/19(日) 07:24:20.07ID:M/ehGL7C
>>334
たまたまLeaveCriticalSection()はエラーを返さないが
エラーを生じるブツだったらどうすんじゃ

まあエラー通知先があれば良いのでやりようはあるが
加速度的に手が込んだコードが必要になって全体が糞化していくんじゃ!
2020/01/19(日) 07:35:30.18ID:ilIPQsua
そもそもそのgotoを書きたくなるくらい深くネストしている時点でよくない説
2020/01/19(日) 08:03:07.26ID:Wel1D6/w
>>338
対象とするデータによっては単純に多重ループで処理するのがもっとも自然でシンプルなケースもあるだろう。
無条件に「ネストしたループ(・A・)イクナイ!!」と言うのも教条主義じゃね?
2020/01/19(日) 08:05:11.96ID:6oeBvQPN
教条主義というよりただのバカ
2020/01/19(日) 08:08:17.50ID:D5W6f6uH
gotoの使い方くらい知っておいた方が良いかと
342デフォルトの名無しさん
垢版 |
2020/01/19(日) 08:51:50.65ID:2MN/c8bt
gotoにせよthrowにせよ、goto/throwの発生元が分からないのが受身になる側として辛い。
この点は、スタック情報へのアクセスが言語仕様として認められているJava/C#/Perl/Pythonに優位がある。
2020/01/19(日) 08:54:43.67ID:M/ehGL7C
throwの発生元は例外オブジェクトに情報を持たせれば良いじゃん?
gotoのジャンプ元は変数に情報を持たせれば良いじゃん??
344デフォルトの名無しさん
垢版 |
2020/01/19(日) 09:02:38.34ID:2MN/c8bt
>>343
goto/throw発生元がバイナリで配布されている場合は、コードを書き換えられない。
クラス設計でやたらとメンバ変数をprivateにされると、クラスを利用する側はメンバ変数を古典的プリントデバッグできなくて難儀する。
345デフォルトの名無しさん
垢版 |
2020/01/19(日) 09:04:12.06ID:2MN/c8bt
C++のprivate属性は厳しすぎ。readonlyアクセスできる属性があってもいいと思うんだ。
2020/01/19(日) 09:11:24.83ID:M/ehGL7C
>>344
バイナリ配布のブツの例外発生元を何でコードで知りたいのかがわからん…
アドレスがわかったところでソースが無いわけやし……
何事かを言わんとするための想定に無理が有るのでは…
347デフォルトの名無しさん
垢版 |
2020/01/19(日) 09:12:59.39ID:2MN/c8bt
タイミング依存の不具合を追跡する必要に迫られると、当然ながら対話デバッグはできない。
C++のprivate変数が不具合に関与しているとわかってもランタイムで値を見れないのは辛い。
他人様の作ったC++クラスヘッダーを一時的に書き換えてコンパイルする羽目に。
348デフォルトの名無しさん
垢版 |
2020/01/19(日) 09:17:35.49ID:2MN/c8bt
>>346
例外が吐かれた後にできることなんてほとんどなくてもスタックをダンプできるだけでかなり助かる。
特に自分が作ったわけではないレイヤーでthrowされた時には、スタック情報が役立つ。
349デフォルトの名無しさん
垢版 |
2020/01/19(日) 09:20:25.20ID:2MN/c8bt
公式がデバッグシンボルを配布するご時世なのに、C++のスタック仕様はそれについていけていない。
デバッガを介することなくスタックをダンプできる手段が制約されすぎ。
2020/01/19(日) 10:49:09.39ID:CSTVsvTH
gotoはRAIIと相性が悪いってのが端的だろ

これはgotoが悪いと言うよりc++の言語仕様上のgotoの扱いが悪いって話

constexprで使えないとか規格が新しくなる度に不都合が増えていくよ
2020/01/19(日) 10:57:40.21ID:RfLx+x9F
gotoの使い方くらい知っておいた方が良いかと
2020/01/19(日) 11:07:08.87ID:fzpRtoDi
>>350
相性悪い?
2020/01/19(日) 11:07:41.05ID:CSTVsvTH
文字列パーサー内とかでの状態遷移に使うは推奨する

その他でのgotoは代替手段があるし、そっちの方が言語サポート良いからgoto使うのはバカのやること
2020/01/19(日) 11:12:09.60ID:CSTVsvTH
まあ不遇な原因はgotoが自由すぎて前にも後ろにも飛べるせいだろうね
変数のデストラクタを呼ぶべきかどうかフラグ管理でもしないとコンパイラが判断できなくなる。

goto使うならその自由さが必要な場面でこそ使うべきなんだよ
355デフォルトの名無しさん
垢版 |
2020/01/19(日) 11:18:58.21ID:2MN/c8bt
>>354
プログラミング言語の世界では、前や後ろという表現は直観的にわかりにくい。
前や後ろは相対的なものであり、バックしているイテレータにとっては前はバックなのだ。
上と下なら直観的にわかるだろう。
2020/01/19(日) 11:21:16.66ID:CSTVsvTH
用語としては前後で統一されているような
2020/01/19(日) 11:22:22.50ID:RfLx+x9F
gotoの使い方を知らない初心者がこのスレにいるってのが不思議
358デフォルトの名無しさん
垢版 |
2020/01/19(日) 11:27:05.68ID:2MN/c8bt
[コラム] 正規表現の先読み/後読みは、どう考えても名前が悪いので、呼称禁止令を出してルックと気軽に呼んでみませんか。 - Qiita
https://qiita.com/mochizukikotaro/items/84f3ab2740b8efbe0dc6
2020/01/19(日) 11:29:47.11ID:6oeBvQPN
>>357
誤魔化さない説明がちゃんとできるやつがずいぶん少ないという、残念な状況が今の日本だ
2020/01/19(日) 11:38:04.97ID:RfLx+x9F
わざわざ複雑にしてまでgotoを避ける
って宗教だよな

使いどころで使う
それだけ
2020/01/19(日) 11:42:59.02ID:ZzFAG3/g
いうて必要になったことないや
2020/01/19(日) 12:30:11.44ID:L2mlhsAt
別にgoto使っても使わなくても馬鹿が書けば複雑なコードになるだろ。
そういう問題じゃない。
そもそもc++の標準ライブラリが例外投げる時点でgotoとの相性は最悪だよ。
一番末端の関数で、副作用もないようなもの以外使えんわ。
2020/01/19(日) 12:36:07.26ID:PgEzQeWd
gotoおじさんはたぶん例外安全性という概念をわかってない
2020/01/19(日) 14:43:36.08ID:6jfPBIzz
>>363
例外安全の定義が難しいのですが、gotoを使っても例外安全を保障することはできると思うのですが、いかがでしょうか。
2020/01/19(日) 15:06:56.67ID:PgEzQeWd
>>364
c++の標準ライブラリに関して例外安全とは何かは定義されてる
できるできないで言えばgotoかつ例外安全はそりゃできるでしょうよ
まずgoto関係なしに例外安全が相当大変であることを理解してから出直してくれ
そうじゃなきゃRAII、autoなんとかmakeなんとかの有難みも理解できてないのよ
2020/01/19(日) 15:08:40.81ID:RfLx+x9F
話題のすり替え
2020/01/19(日) 15:16:49.04ID:PgEzQeWd
>>366
話題を勘違いしてるのはお前だよ
お前は単にbreakでスコープの脱出することに対してgotoの方が簡潔と言ってるんだろう
そういう場合があるのは同意するけど今回の話題はそれじゃない

スコープの脱出になってるのはRAIIでリソースを安全に開放する前提だからだ
だからお前が言うべきはスコープをなくしてgotoを使うというなら
合わせてリソースをどのように安全に開放するかを説明しないといけない
場当たり的でない方法でね

そこをまったく説明できない以上お前はgotoおじさんと呼ばれ続ける
2020/01/19(日) 15:20:52.99ID:fzpRtoDi
>スコープをなくしてgotoを使う

なんか言ってることが変だと思ったらこんな条件付けてたのか。ブロックスコープ使えばいいじゃん。
2020/01/19(日) 15:26:55.90ID:RfLx+x9F
スコープを無くしてgotoで解放?
なんじゃそりゃ?

スコープを抜けないと解放されないぞ
2020/01/19(日) 15:27:43.53ID:PgEzQeWd
断わっておくけど
>>295 に対してgotoおじさんが >>297 と言ったのが発端
後出しはしていない
ちなみに295を書いたのはおれではない
371295
垢版 |
2020/01/19(日) 15:31:10.41ID:2MN/c8bt
どんな劣悪な環境でも動く do{ } while(0); こそ絶対正義。
2020/01/19(日) 15:33:51.15ID:RfLx+x9F
>>295
do ループを抜けたすぐ下で資源を解放
って書いてあるように見えるけど
2020/01/19(日) 15:34:25.99ID:RfLx+x9F
>>370の勘違いってことでいいのかな?
2020/01/19(日) 15:42:01.04ID:PgEzQeWd
>>372
ああ確かに >>295 に対してってのは語弊があったかな
ID:cLOUBKze の発言を追ってみて
>>303
とかね
gotoおじさんかと思ったら別人なのね
2020/01/19(日) 17:03:31.99ID:6jfPBIzz
>>365
本来の「例外安全」の定義はもっと広い意味なのですが、あなたは、throwやcatchなどの「例外」が起きたときでもnewされたオブジェクトの削除などを行うという定義を採用されているようです。

break文を用いずにgoto文でブロックを脱出した場合でもオブジェクトは自動解放されるのをご存知ですか?
2020/01/19(日) 17:07:28.86ID:PgEzQeWd
>>375
自分は理解しているって言いたいわけね
じゃあさ >>273 のお題に対してgotoを使ったエレガントな方法を書いて
おれは思いつかないね
よろしく
2020/01/19(日) 17:11:06.93ID:4SQs66uE
そもそも一番のカスはこいつ >>276 >>286
2020/01/19(日) 17:42:21.12ID:fzpRtoDi
>>370

>>295に対して>>303

{
goto label;
}
label:

でいいんじゃないかってことかと。
逆にどう解釈してRAIIとか例外安全とか持ち出したのか気になる。
2020/01/19(日) 18:24:30.09ID:6oeBvQPN
論点を増やそうとするのは苦しいやつの習性だね
2020/01/19(日) 18:46:40.48ID:PgEzQeWd
>>378
それだとdo-whileと変わんないだろ
gotoおじさんの論点てそれか?
人の事クソバカ言ってるわりに何の優位性があるのかわからんな
2020/01/19(日) 18:52:29.41ID:6oeBvQPN
そうだよ、変わんないよ
複合文だけでできることになんでわざわざdoなんて面倒くせえもん使わなきゃいけねえんだよ
382デフォルトの名無しさん
垢版 |
2020/01/19(日) 18:52:32.23ID:PM2cmccN
Rust使えばすべて解決。
2020/01/19(日) 18:53:23.88ID:6oeBvQPN
まさかとは思うがブレースを開くのにdoだかforだか何らかのキーワードが必要とでも思ってたか?
384デフォルトの名無しさん
垢版 |
2020/01/19(日) 18:56:46.75ID:PM2cmccN
俺は何の実績もないおまえの言うことより、あわしろいくや氏を信じるけどな。
2020/01/19(日) 18:57:26.46ID:yjllCGTd
>>378
噂のgotoおじさまもさすがにこのコードがいいなんて言わないでしょ
2020/01/19(日) 18:59:17.52ID:6oeBvQPN
>>384
ブレースを開くのにキーワードが必要か否かに実績は関係ない
他人のネームバリューにすがるしかなくなったか?
387デフォルトの名無しさん
垢版 |
2020/01/19(日) 19:00:40.10ID:PM2cmccN
>>386
ネームバリューは関係ないんだよ。
あわしろいくや氏は信用できる。
おまえは信用できない。
2020/01/19(日) 19:01:36.43ID:4SQs66uE
>>387
俺はお前のあわしろいくや氏は信用できるという言葉が信用できない
389デフォルトの名無しさん
垢版 |
2020/01/19(日) 19:02:52.67ID:PM2cmccN
>>388
俺のことは信用しなくていい。
あわしろいくや氏を信じろ。
2020/01/19(日) 19:15:30.92ID:ocqIlbpk
売名乙
2020/01/19(日) 19:29:04.71ID:yQO+Nq01
まさか do while 構文が論点だと思ってたんかな?
まあ本当はgotoを推す正当性が全くなくてごまかしてるんだろうけれど。
てかgotoと例外安全性はかなり綿密に絡んだ話だろ。誤魔化しすぎだわ。
2020/01/19(日) 19:45:18.96ID:6oeBvQPN
>>387
ヒゲ生やした教祖様のために死刑になった信者と同じだなw
2020/01/19(日) 19:46:34.82ID:fzpRtoDi
>>380
そのくらいしか思いつかなかったが、>>297はその程度の主張だったんじゃないの?
じゃあどういう主張しているとID:PgEzQeWdは解釈していたのかな。そっちが気になる。
2020/01/19(日) 19:46:39.94ID:6oeBvQPN
> かなり綿密に絡んだ話だろ

誤魔化しすぎというブーメランが脳天に突き刺さってるぞw
2020/01/19(日) 19:54:00.26ID:yQO+Nq01
なるほど。。こりゃ話しても無駄だな。
2020/01/19(日) 20:25:44.83ID:M/ehGL7C
gotoと例外安全性がどう絡むのかわからんボスケテ;
2020/01/19(日) 21:06:11.93ID:fzpRtoDi
話しても無駄以前に、結局gotoと例外安全がどう関係するのか一言も出てこなかったな。
2020/01/19(日) 21:10:50.68ID:CSTVsvTH
RAIIとgotoは混ぜられないだろ
2020/01/19(日) 21:13:01.22ID:AinWVopR
そらgotoでリソース開放ルーチンに飛ぶようなCスタイルのプログラム書くと
例外飛んできたときに死ぬって話でしょ
(いくらC++にfinallyが無いからってgotoでリソース開放ルーチンに飛ぶのはダメ)
ただし元々の質問には関係ない話なんだがな

ところでC++にfinallyが無いのはちょっと良くないよね
今となってはラムダで自作できるようになったからいいけど
2020/01/19(日) 21:16:51.88ID:fzpRtoDi
>>398
その「混ぜる」って具体的にはどういうことを言ってるんだろう。
2020/01/19(日) 21:24:53.93ID:AinWVopR
基本的に break や return も生き先の決まった goto なので
余ほど変な使い方をしない限りRAIIと goto を混ぜれないって事はないよなぁ
むしろ RAII を使わないで goto でC系のリソース開放をしていた場合にハマるって話では

まぁでもこれは
do{
  if( error ) break;
}while(0);
//開放処理
return;
でも同じことだし、元の質問には関係ないんだが
2020/01/19(日) 21:34:33.08ID:RfLx+x9F
まだやってんのか

>>377
それ
2020/01/19(日) 21:40:42.19ID:RfLx+x9F
do {
if(...) break;
} while (0);

よりは

{
if (...) goto label;
}
label:

の方が良い

という意見に賛成

>>303ではないけど
2020/01/19(日) 21:44:50.08ID:RfLx+x9F
まあどっちでも大差ないけど
2020/01/19(日) 21:47:25.68ID:RfLx+x9F
{
{
if (...) goto label;
}
}
label:

これはbreakじゃ無理
2020/01/19(日) 21:57:15.09ID:RfLx+x9F
{
switch (...)
{
case ...: goto label;
}
}
label:

これも無理
2020/01/19(日) 22:11:05.36ID:ByUy1Erg
while(0)とか意味不明なコードよりgotoでスコープ抜ける方がはるかにシンプルだわな
2020/01/19(日) 22:15:20.58ID:RfLx+x9F
一応 do while(0) の使い方も覚えておいた方が良い
他人のコードを見たりマクロで使ったり
する事もあるだろうから
2020/01/19(日) 22:17:28.52ID:JMAoH3/H
普段のdo whileもwhile(0)って書くなど弊害が出るのでやめた方がいい
2020/01/19(日) 22:19:27.67ID:ByUy1Erg
ループするつもりもないのにループの構文使うのは悪手だと思う
2020/01/19(日) 22:27:26.89ID:RfLx+x9F
>>409
日本語で
2020/01/19(日) 22:33:02.85ID:fzpRtoDi
そこはまぁ、ループではあるけれども同時にbreakが使えるブロックでもあるわけで、
実際do-whileなんてほとんどがそういう使い方しかされていないわけだし。
ループできる構文でループしないのはbreakできる構文でbreakを使わないのと
同じようなものかと。
2020/01/19(日) 22:36:02.43ID:JMAoH3/H
>>411
do whileしてるのになぜか1回しか実行してないのに気付くのに時間がかかる
習慣で書くのでwhile(0)に気づけない
2020/01/19(日) 22:48:25.05ID:PgEzQeWd
こんなささいな違いは個人の好みでいいと思う派
do-while使わない派の言い分もわからなくもないが、
ソースを読む場合gotoだってgoto先を確認しないと意図が理解できないだろ
label名を考える必要があるのもちょっとめんどい
なのでこんなのどっちでもいい
ちなみにrust方式もブロックの先頭にラベル付いてるのは若干違和感覚える
2020/01/19(日) 22:50:45.02ID:RfLx+x9F
>>413
誰か解説よろしく!
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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