20/01/11 01:15:06 GiJYoHUo.net
>>194
大丈夫
nullptrの代入は何も関数を保持していない状態にする
201:デフォルトの名無しさん
20/01/11 01:43:57 mrkcLLQe.net
なるほど!
?クス、
202:デフォルトの名無しさん
20/01/11 15:19:42.16 hPLqZ0ty.net
C++11の知識でC++書いてるけど、特に不便ないな
最新のC++だと何ができるの?
203:デフォルトの名無しさん
20/01/11 15:29:42.91 pEBt3sLq.net
なら知らなくていいんじゃない?
204:デフォルトの名無しさん
20/01/11 15:47:51.76 9vrnWCM9.net
お前がC++11で十分と思っていても他人はお前に遠慮なんかせずC++20の記法で書く
お前がヘッダーをよこせと言ってもモジュールしか提供されない
205:デフォルトの名無しさん
20/01/11 17:14:40.32 hPLqZ0ty.net
なにを怒ってるんだよ
イージーになろうぜ、イージー
206:デフォルトの名無しさん
20/01/11 17:26:39.19
207: ID:hPLqZ0ty.net
208:デフォルトの名無しさん
20/01/11 17:33:49.75 7JWsqvWB.net
標準ライブラリにはまだモジュール使われないんだろ?
20の次あたりでモジュール版も出てくるかどうかだろ
209:デフォルトの名無しさん
20/01/11 17:48:06.88 XaO4QoYK.net
>>202
シルカばーーーか
210:デフォルトの名無しさん
20/01/11 17:53:38.30 hPLqZ0ty.net
モジュールって何?
211:デフォルトの名無しさん
20/01/11 18:22:48.55 G3Wgm73J.net
モジュールってテンプレート持てるの?
212:デフォルトの名無しさん
20/01/11 18:28:46.90 AvFBkNTe.net
またテンプレートの分割コンパイルを誰かが1年ぐらいかけて実装して、
できたころには陳腐化しているという歴史の繰り返し
永遠に枯れない
213:デフォルトの名無しさん
20/01/11 19:01:55.71 hPLqZ0ty.net
gcc10入れた!
-std=c++2aでモジュールって使えるの?
214:デフォルトの名無しさん
20/01/11 19:15:28.94 hPLqZ0ty.net
なんだ-std=c++2aでは使えないみたいだな
概念的にはGoのpackageに近いのかな?
215:デフォルトの名無しさん
20/01/11 19:29:30.73 OEMCT43T.net
多分もう相手されないから引っ込んだ方がいいよ
216:デフォルトの名無しさん
20/01/11 19:30:41.47 hPLqZ0ty.net
なんでだよー><
相手してくれよー><
うわわわわん
217:デフォルトの名無しさん
20/01/11 22:12:41.17 o20hTksc.net
まだ実装してるコンパイラが無いっぽいから誰も使い勝手なんかわからんわな
>>205
持てる
218:デフォルトの名無しさん
20/01/12 05:48:12 LolRUOoj.net
1) mkl_blas.h がシステムに存在したらそれをインクルードし、行列行列積ルーチンとして (C++で実装された) dgemmを使う。
2) mkl_blas.hが存在しなければFortranルーチンのdgemm_を使う。
というのを実現したいとします。
mkl_blas.h もないし Fortranルーチンもないという状況は考えません。
関数名の末尾のアンダースコアの有無がややこしくて困っています。
#if __has_include(<mkl_blas.h>)
#include<mkl_blas.h>
#define dgemm_ dgemm
#else
extern "C" void dgemm_(省略);
#endif
としておいて、プログラム中の行列行列積ルーチンは全てdgemm_と書くことでお茶を濁しているのですが、もっとスマートな方法はありますか。
#define dgemm_ dgemm
という部分がいかにも場当たり的で気に入らないです。
219:デフォルトの名無しさん
20/01/12 09:50:22.73 GTFqFgmO.net
usingで別名にしてしまうとか?
220:デフォルトの名無しさん
20/01/12 09:59:58.48 g8OSapKt.net
俺ならソースにdgemm_みたいなのがあるのは嫌だから
#if __has_include(<mkl_blas.h>)
#include<mkl_blas.h>
#else
#define dgemm dgemm_
extern "C" void dgemm_(省略);
#endif
ってやると思う
221:デフォルトの名無しさん
20/01/12 12:48:26.98 JaW6uvCT.net
マクロが嫌ならinline関数にすればいいんじゃね
222:デフォルトの名無しさん
20/01/12 20:04:38.92 2yY0psIJ.net
C++で次々に追加される無駄機能は
Cをしっかり理解していれば同等の機能を実装するのは造作もないものが多い
223:デフォルトの名無しさん
20/01/12 20:05:36.02 Age3j7t+.net
では具体例お願いします
224:デフォルトの名無しさん
20/01/12 20:35:35.36 +J7i572i.net
void*が出てくる時点で論外なのでよろしく
225:蟻人間
20/01/12 20:41:55.23 26db5mti.net
#define my_static_assert(cond, msg) typedef char my_static_assert_failed[(cond) ? 1 : -1]
226:デフォルトの名無しさん
20/01/12 20:59:55.77 Svv4a/Ag.net
Cはマクロの使い方次第で出来ることが深まるんだよな
ただC++はマクロ使わない方向で進化してるからな
227:デフォルトの名無しさん
20/01/12 21:09:19.71 gA+rg5vj.net
>>212
下手なことするよりその書き方のが良い。個人的には214の方のが好きだが大して変わらん。
228:デフォルトの名無しさん
20/01/12 21:35:06.84 TRbEu5Zq.net
いざというときも最悪Cならコンパイラを自作できるが
229:C++はちょっと…
230:デフォルトの名無しさん
20/01/12 21:56:32.12 Svv4a/Ag.net
いやいや
gccとかC++だし
231:デフォルトの名無しさん
20/01/12 22:39:39.23 MD4l5gjt.net
うちの会社C++03なんだけど・・・
232:デフォルトの名無しさん
20/01/12 22:51:11.80 Age3j7t+.net
それが妥当かどうかは業務による
233:デフォルトの名無しさん
20/01/13 01:41:11 rQk6tfo+.net
おとなしく頭の良い奴に従っとけ
自分が優秀だと思い込んでいる精神異常者の諸君
234:デフォルトの名無しさん
20/01/13 01:58:06 xcD2sz0v.net
頭のいい奴は総じてc++はカスだと言っとるぞ。
235:デフォルトの名無しさん
20/01/13 02:05:13 Px4xDI4Q.net
増えていく機能が軒並み
プログラミング始めたてのやつが持つ不満を具現化したようなものばかりだ
慣れていくとCがそうである理由がわかってきて、いらなくなっていく
おおかた頭のいい奴が新規で入ってきて、慣れてないくせに良かれと思って追加してるんだろう
236:デフォルトの名無しさん
20/01/13 02:15:09 8CXSeWtZ.net
例を教えてくれ。
237:デフォルトの名無しさん
20/01/13 03:56:13.32 rQk6tfo+.net
頭の悪い奴向けの機能なんだが
238:デフォルトの名無しさん
20/01/13 06:52:04.51 zZXHCgLl.net
>>216 >>228
具体例早くしてくれ
抽象論では話にならん
239:デフォルトの名無しさん
20/01/13 09:16:12.93 j6Sgy/j5.net
C++コンパイラとC++のライブラリはC言語でも書けるから
当たらずしも遠からずだと思う
240:デフォルトの名無しさん
20/01/13 09:25:57.13 a0NWv3WS.net
全くCで書かれてないコンパイラってあるの?
241:デフォルトの名無しさん
20/01/13 10:25:34.29 pIGOCTOQ.net
Cでテンプレート対応できるの?
242:デフォルトの名無しさん
20/01/13 10:30:00.85 +nJPsH/6.net
>>228
C++は大人数で開発するための言語なんだからてめー個人がいるかいらないかなんて関係ねーんだわ
243:デフォルトの名無しさん
20/01/13 10:36:38.68 +nJPsH/6.net
チームでの開発を安全に進めるための機能なんて熟練者が書く分にはそりゃいらんだろ
で?
244:デフォルトの名無しさん
20/01/13 12:52:54.65 A/MByXKy.net
まあアセンブラさえあれば他に必要ないし
でもそこそこ規模大きいプロジェクトはc++多いよね
反例にlinuxはあるけど
245:デフォルトの名無しさん
20/01/13 13:04:44.90 xcD2sz0v.net
windowsでさえc++なんか使わなけりゃよかったいうとるぞ。
つまり低レイヤー触るのに向いてるようでそうでもないってのがc++なんだよ。
246:デフォルトの名無しさん
20/01/13 13:20:13.66 j6Sgy/j5.net
リーナスは低レベルな人やからな
247:デフォルトの名無しさん
20/01/13 13:20:44.02 FqpttVgU.net
だから?
248:デフォルトの名無しさん
20/01/13 22:54:55.25 /BeY0uog.net
>>233
Sun/OracleのJavaのコンパイラ javac は Java 自身で書かれている。
IBM製のJavaコンパイラ ecj も同じく。
249:デフォルトの名無しさん
20/01/13 23:00:48.10 FqpttVgU.net
JVMもJavaで書いてみせろ
250:デフォルトの名無しさん
20/01/13 23:44:05.72 vq82NN4B.net
皆さんが使用されているエディタを教えてください....🙇♀
251:デフォルトの名無しさん
20/01/13 23:45:43.26 jU0I703o.net
自作
252:デフォルトの名無しさん
20/01/13 23:45:56.78 5GjUS2iX.net
メモ帳
253:デフォルトの名無しさん
20/01/13 23:46:58.98 vq82NN4B.net
あ、すみません僕は今はatomを使っています
自作のエディタを使ってらっしゃる方なんているんですね。。。
254:デフォルトの名無しさん
20/01/14 06:11:49.55 J0UMnVjO.net
emacs
255:デフォルトの名無しさん
20/01/14 13:29:05.29 PBX58Pvh.net
某板金社製
256:デフォルトの名無しさん
20/01/14 16:11:50.76 gkNCY9ap.net
↓のコードはコンパイルが通るのですが、func(1)ではなく、func<int32_t>(1)のようにしなければいけないと思っていたんですが、そうではないんですか?
これはコンパイラが勝手にTの型を推測してくれているのでしょうか?
#include <iostream>
template<class T>
void
func(T value) {
std::cout << value << std::endl;
}
int main() {
func(1);
return 0;
}
257:デフォルトの名無しさん
20/01/14 16:13:46.64 MAaOflfD.net
俺は自ら望んでなったC++使いだが
リーナスの主張には何ら文句はない
俺も好かんところがいくつかあって我慢しているが
他の人がキレるのを否定はしない
258:デフォルトの名無しさん
20/01/14 19:00:56.35 jdAaUvyI.net
>>249
intに推論されてるね。
関数は推論してくれる。
259:デフォルトの名無しさん
20/01/14 19:47:23.47 gkNCY9ap.net
>>251
そうなんですか
ありがとうございました
260:デフォルトの名無しさん
20/01/14 19:55:58.10 MAaOflfD.net
C++17からはクラスも推定するようになったから気をつけろな
261:デフォルトの名無しさん
20/01/14 20:10:13.46 3eaorBLU.net
地獄になるのが目に見えるわ。
262:デフォルトの名無しさん
20/01/14 20:20:51.77 J0UMnVjO.net
>>249
>>251
もう少し正確に言うと関数の引数の型については推論してくれる。
戻り値については推論してくれないから<>で型を指定する必要がある。
template<typename T>
T func(double v){
return static_cast<T>(v);
}
int main(){
// int pi = func(3.14); // エラー
int pi = func<int>(3.14);
return 0;
}
263:デフォルトの名無しさん
20/01/14 23:30:18 gkNCY9ap.net
>>253,255
なるほど!
ありがとうございます
264:デフォルトの名無しさん
20/01/15 00:35:48 7a3J15MS.net
>>256
いえいえ
265:デフォルトの名無しさん
20/01/15 08:07:26.85 Af26ZTs6.net
>>257
楽しい?
266:デフォルトの名無しさん
20/01/16 01:26:49.29 Ue561N6A.net
C#使ってきたわい、C++入門するにあたって何から手を付けたらいいか分からない
江添の入門本読んだらええの?
267:デフォルトの名無しさん
20/01/16 04:14:44 SACm472n.net
+を重ね合わせないでずらして書くと#じゃなくて++になるやろ
つまりそういうことや
268:デフォルトの名無しさん
20/01/16 06:13:59.73 iXD/XJ1o.net
あんなカス本読むならビャーネの本とeffective系統を何冊か読んだ方がよっぽど為になる。
269:デフォルトの名無しさん
20/01/16 08:12:06.71 +e0TuAjq.net
俺も自分の経験からは禿の本をオススメすることになる
270:デフォルトの名無しさん
20/01/16 18:58:35 aiRikJgB.net
C++においてハゲとは神を意味するからな
271:デフォルトの名無しさん
20/01/16 20:10:19 5A9213qe.net
また髪の話ししてる
272:デフォルトの名無しさん
20/01/17 02:03:14 nV1+qdjp.net
C++でウィンドウ関係の処理を組もうと思っているのですが、
最近だとMFCではなく.Net Framework を利用するのでしょうか?
273:デフォルトの名無しさん
20/01/17 02:20:28 oPB0sz0H.net
いいえ
274:デフォルトの名無しさん
20/01/17 02:26:05 gAZZjojh.net
WebGL
275:デフォルトの名無しさん
20/01/17 06:22:56.76 BtsrcJh0.net
Win32APIが主流ですよ
276:デフォルトの名無しさん
20/01/17 07:24:00.72 sP/gsAG3.net
>>265
MFC抜きでWin32APIだけでコード書くことがあるけど正直無駄な苦痛を感じるよ
MFCもダサいとこあるけどMFCでできることと同じ内容のコードを書いてると泣けてくる
277:デフォルトの名無しさん
20/01/17 08:02:37.47 6PrSA6bz.net
WTLってどうなの?
278:デフォルトの名無しさん
20/01/17 08:03:39.75 +NTDhbdd.net
純粋仮想関数の=0の右辺って定数式なんでしたっけ
279:デフォルトの名無しさん
20/01/17 08:55:06 9u9GYVKv.net
0じゃないか?
280:デフォルトの名無しさん
20/01/17 09:17:21 r0ibn4Bf.net
オブジェクトを明示的に破棄する方法ってある?
自分で new したなら delete すれば良いと思うが、STL コンテナ等の場合はどうすれば良いかという質問です。
例えば巨大な vector を作って何らかの作業をした後、もうその vector は用無しでメモリがもったいないからスコープを抜けるのを待たずに破棄したいみたいな状況を想定してます。
281:デフォルトの名無しさん
20/01/17 09:19:05 oRcV/dFn.net
>>271
純粋仮想関数であることを示すための専用の構文らしい。pure-specifierという。
282:デフォルトの名無しさん
20/01/17 09:22:16 8wRp1qeu.net
>>273
空とswap
283:デフォルトの名無しさん
20/01/17 09:26:42 r0ibn4Bf.net
>>275
場当たり的な対処に思えますが、そういうのが嫌ならマメにスコープを切れということでしょうか。
284:デフォルトの名無しさん
20/01/17 10:03:31 jP7OzWuZ.net
>>276
じゃあvectorをnewしたらいいじゃん
頭使えよ
285:デフォルトの名無しさん
20/01/17 11:18:09 fMuYUnvE.net
>>265
tcl/tk
wxWidgets
Qt
286:デフォルトの名無しさん
20/01/17 12:09:31 FiFP8PG3.net
Qtはメジャーな製品でよく使われてる印象がありゅ
287:デフォルトの名無しさん
20/01/17 12:12:10.21 oPB0sz0H.net
MS製にこだわって頑なにMFCみたいな化石使ってる奴いるけど普通にサードパーティのツールキット使うのが主流
288:デフォルトの名無しさん
20/01/17 12:58:41.79 sP/gsAG3.net
他人のところの事情も知らんくせにシッタカこくと
聞こえたやつ全員からそれぞれ色んな理由でアホにされるぞ
289:デフォルトの名無しさん
20/01/17 13:10:35.05 fMuYUnvE.net
GTKは糞
290:デフォルトの名無しさん
20/01/17 13:38:21.01 oPB0sz0H.net
>>281
選択肢に.NETが出てくるあたり何の制約もない状況でサードパーティが使えない理由とは?
291:デフォルトの名無しさん
20/01/17 14:31:40 sP/gsAG3.net
身バレするから書かない
292:デフォルトの名無しさん
20/01/17 14:39:28 8NRoOtOw.net
スレ違いでしょ。続きはWin32APIスレに移動してどうぞ。
293:デフォルトの名無しさん
20/01/17 15:05:49 r0ibn4Bf.net
vectorをnewする?
ゴミみたいなこと言うな
294:デフォルトの名無しさん
20/01/17 15:19:25 yexmiyzj.net
質問する側の態度とは思えん
295:デフォルトの名無しさん
20/01/17 15:28:54 WQqGcJSL.net
> 自分で new したなら delete すれば良いと思うが
良いと思ってるならvectorもnew/deleteで良いでしょ
296:デフォルトの名無しさん
20/01/17 15:35:23 NjgiFnOV.net
vector newでいけない理由を先に説明してくれないと
297:デフォルトの名無しさん
20/01/17 17:45:27.47 xt9i4Zu8.net
> スコープを抜けるのを待たずに
> 破棄したいみたいな状況を想定してます。
破棄するタイミングはコンパイラには分からんのだろ
人が判断するしかないなら「場当たり的」にやるしか無いのでは
298:デフォルトの名無しさん
20/01/17 17:56:19.89 8NRoOtOw.net
vector::clear()、vector::shrink_to_fit() の連続実行で十分なのでは?
299:デフォルトの名無しさん
20/01/17 18:12:09.22 2FWha3Nl.net
shrink_to_fit
capacity()をsize()に縮小させるというリクエストを行う。
実装依存の最適化を許可するために、縮小するという動作は仕様上強制されない。
縮小されないかもしれない、らしい
300:デフォルトの名無しさん
20/01/18 11:20:53 Iw/95SDF.net
たいていは逆にスコープを破棄のタイミングに合わせるような書き方すればいいだろ。
分岐の激しい破棄条件書くくらいならそっちのが楽なことは多い。
301:デフォルトの名無しさん
20/01/18 11:59:37 timcC3h8.net
while {
302:デフォルトの名無しさん
20/01/18 12:04:39 timcC3h8.net
途中で投稿してしまい失礼。
do {
} while(0);
で括って、処理が続行できない場合はbreakして、doループを抜けたすぐ下でで資源解放する古典的な記述でいいのでは。
303:デフォルトの名無しさん
20/01/18 12:12:16 LluV6Hhd.net
糞野郎にみんな親切だな
304:デフォルトの名無しさん
20/01/18 14:36:14.37 cLOUBKze.net
gotoを避けるためにgotoよりクソなコードを書くのがいいわけねえだろ
305:デフォルトの名無しさん
20/01/18 14:54:44.30 timcC3h8.net
ま、資源解放のコーディングが楽になるなら正義でしょ。
306:デフォルトの名無しさん
20/01/18 16:33:12 cLOUBKze.net
>>298
確認するが、ここがC++スレということは忘れてないよな?
307:デフォルトの名無しさん
20/01/18 16:37:31 sDwxplmd.net
メモリがもったいない言うけど、ホントにカツカツなのだろうか
環境的に余裕であれば妙なコーディングする意味がない
308:デフォルトの名無しさん
20/01/18 20:06:16 6Wtj4R8r.net
どんくらいスキマと余裕があるのかを常時監視するソフトウェアはかんたんに作れる
なんせわたくしはC++を極めましたからな
309:デフォルトの名無しさん
20/01/18 20:37:07 0qsbj5e6.net
>>297
gotoより糞な訳無いだろ
こんな単純で頻出する制御構造が文法上ループにせざるを得ないのが悪いだけ
まあtry catchと同型だが、これだと遅くなるしね
310:デフォルトの名無しさん
20/01/18 20:39:57 cLOUBKze.net
>>302
doでない単純な複合文とgotoで済む話だ
アホwバカwww
311:デフォルトの名無しさん
20/01/18 20:44:02 0qsbj5e6.net
gotoだとRAII対応できないじゃん
312:デフォルトの名無しさん
20/01/18 20:44:36 7kb+tsdB.net
すまねーよ。他の例外で飛ばされたらどうすんだ馬鹿。
313:デフォルトの名無しさん
20/01/18 20:46:21 cLOUBKze.net
>>304
do(0) なんて持ち出すアホが RAII かよw
314:デフォルトの名無しさん
20/01/18 20:47:02 0qsbj5e6.net
まあ最近は
[&]{
...
}();
で書くことが多いが
315:デフォルトの名無しさん
20/01/18 20:48:42 0qsbj5e6.net
do{}while(0);の問題は知らない奴が混乱するって一点のみだろ
316:デフォルトの名無しさん
20/01/18 20:59:02 cLOUBKze.net
「知ってるやつ」の言い訳を、ここで開陳してもらおうか
最近、笑う健康法ができてないんで、よろしく頼むわ芸人さん
317:デフォルトの名無しさん
20/01/18 21:04:02 0qsbj5e6.net
その前にgotoより糞ってのが既に成立してないじゃん
どこが糞なのか具体的に
318:デフォルトの名無しさん
20/01/18 21:10:26 cLOUBKze.net
ははは、話を逸らすしかねえよな
「do{}while(0);の問題」てのが他の問題によって
成り立つのか成り立たねえのか影響されると
自ら自白してやがる(核爆
助けてやらねえよ、自分でなんとかしなアホwバカwww
319:デフォルトの名無しさん
20/01/18 21:15:23 0qsbj5e6.net
意味がわからないよ
煙に巻いて逃げる気かなw
320:デフォルトの名無しさん
20/01/18 21:19:10 cLOUBKze.net
>>312
逃がさねえぞ
「知ってるやつ」の言い訳を、ここで開陳してもらおうか
最近、笑う健康法ができてないんで、よろしく頼むわ芸人さん
321:デフォルトの名無しさん
20/01/18 21:19:14 65HS6FKB.net
やりたいことはスタックにあるvectorの早期解放なんだから
gotoもdo{}while(0)もラムダ式もいらない
単に{}で囲うだけでいい
322:デフォルトの名無しさん
20/01/18 21:20:27 cLOUBKze.net
だよなwwwwwwwwwwww
323:デフォルトの名無しさん
20/01/18 21:23:34 Upzp+V6z.net
↓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;
324:デフォルトの名無しさん
20/01/18 21:28:09 Upzp+V6z.net
つか
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風に
325:デフォルトの名無しさん
20/01/18 21:30:23 v/DZPeDP.net
>>314
そんなことはお前ともう1名ほど除いて皆わかってる
そうじゃなくて特定の条件で早期に開放したい場合にどうするかだよ
>>315
味方が現れてウレションかよw
326:デフォルトの名無しさん
20/01/18 21:30:23 cLOUBKze.net
ID:0qsbj5e出てこいオラ
327:デフォルトの名無しさん
20/01/18 21:34:58 cLOUBKze.net
ID:0qsbj5e6 出てこい
328:デフォルトの名無しさん
20/01/18 21:42:46 65HS6FKB.net
>>318
auto v = std::make_unique<std::vector<Hoge>>(...);
...
if(特定条件){
v.reset();
}
これだけの話では?
329:デフォルトの名無しさん
20/01/18 21:45:43.25 cLOUBKze.net
そうそう
兆くだらねえ話だ(わざと誤字
330:デフォルトの名無しさん
20/01/18 21:47:11.24 cLOUBKze.net
goto過敏症のアホどもが少しでも目を醒ましてくれるといいな
331:デフォルトの名無しさん
20/01/18 21:49:54.58 v/DZPeDP.net
>>273
から読み直して
空moveが確実だけど質問者がそれを場当たり的と生意気言ったことから話が盛り上がるw
332:デフォルトの名無しさん
20/01/18 21:51:28.17 v/DZPeDP.net
>>323
この場合gotoは何の解にもなっていないことにそろそろ気づいた方がいいよ
333:デフォルトの名無しさん
20/01/18 21:53:26.94 v/DZPeDP.net
>>321
>>324 を読んでね
334:デフォルトの名無しさん
20/01/18 21:59:36.19 0qsbj5e6.net
RAII対応してないから無理矢理goto出来るようにした糞コード上げられてもああ糞ですねと言うしかないんだが。
内部が複雑になってきたらその度にブロック外に変数追加して、変数の内容の初期化は必要に応じてって書き方を続けるつもりなんかね
335:デフォルトの名無しさん
20/01/18 22:27:52 cLOUBKze.net
>>325
gotoが何かの解になったらいいの?wwwwwwww
336:デフォルトの名無しさん
20/01/18 22:28:06 4nVoSga0.net
>>304
そうなんだっけ?
337:デフォルトの名無しさん
20/01/19 00:26:12.30 M/ehGL7C.net
やっぱこういうコードは一度書いてみたいよな
try {
label:
何かの処理;
} catch (Exception ex) {
goto label;
}
338:デフォルトの名無しさん
20/01/19 00:32:09.37 M/ehGL7C.net
gotoを使うと糞、と言う香具師は多いが
goto以外の構文も大概なことがある
↓これとか
EnterCriticalSection(&csec);
{
if (エラー条件成立) {
LeaveCriticalSection(&csec);
throw "*** ERR ***";
}
何かの処理;
}
LeaveCriticalSection(&csec);
一体どうすれば…orz
339:デフォルトの名無しさん
20/01/19 00:36:14.30 M/ehGL7C.net
いやまあテストラクトされるときにLeaveCriticalSection()するような
AutoLockオブジェクトを使えば済むっていやー済むが
裏返せばgoto以外の構文も糞製造機であることにはかわりわない!
340:デフォルトの名無しさん
20/01/19 00:38:55.96 ocqIlbpk.net
それは構文が糞なんじゃなくてリソース管理が糞なだけ
341:デフォルトの名無しさん
20/01/19 01:24:22.15 PgEzQeWd.net
auto lockなんてむしろ使ってなかったらPRでリジェクトされる
342:デフォルトの名無しさん
20/01/19 06:28:34 6oeBvQPN.net
gotoの何が悪いのかを端的に表すたった一言が出てこない教条主義は物笑いの種
343:デフォルトの名無しさん
20/01/19 07:19:17.26 M/ehGL7C.net
誰にも迷惑がかからない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:
;
344:デフォルトの名無しさん
20/01/19 07:24:20.07 M/ehGL7C.net
>>334
たまたまLeaveCriticalSection()はエラーを返さないが
エラーを生じるブツだったらどうすんじゃ
まあエラー通知先があれば良いのでやりようはあるが
加速度的に手が込んだコードが必要になって全体が糞化していくんじゃ!
345:デフォルトの名無しさん
20/01/19 07:35:30.18 ilIPQsua.net
そもそもそのgotoを書きたくなるくらい深くネストしている時点でよくない説
346:デフォルトの名無しさん
20/01/19 08:03:07 Wel1D6/w.net
>>338
対象とするデータによっては単純に多重ループで処理するのがもっとも自然でシンプルなケースもあるだろう。
無条件に「ネストしたループ(・A・)イクナイ!!」と言うのも教条主義じゃね?
347:デフォルトの名無しさん
20/01/19 08:05:11 6oeBvQPN.net
教条主義というよりただのバカ
348:デフォルトの名無しさん
20/01/19 08:08:17 D5W6f6uH.net
gotoの使い方くらい知っておいた方が良いかと
349:デフォルトの名無しさん
20/01/19 08:51:50 2MN/c8bt.net
gotoにせよthrowにせよ、goto/throwの発生元が分からないのが受身になる側として辛い。
この点は、スタック情報へのアクセスが言語仕様として認められているJava/C#/Perl/Pythonに優位がある。
350:デフォルトの名無しさん
20/01/19 08:54:43 M/ehGL7C.net
throwの発生元は例外オブジェクトに情報を持たせれば良いじゃん?
gotoのジャンプ元は変数に情報を持たせれば良いじゃん??
351:デフォルトの名無しさん
20/01/19 09:02:38 2MN/c8bt.net
>>343
goto/throw発生元がバイナリで配布されている場合は、コードを書き換えられない。
クラス設計でやたらとメンバ変数をprivateにされると、クラスを利用する側はメンバ変数を古典的プリントデバッグできなくて難儀する。
352:デフォルトの名無しさん
20/01/19 09:04:12 2MN/c8bt.net
C++のprivate属性は厳しすぎ。readonlyアクセスできる属性があってもいいと思うんだ。
353:デフォルトの名無しさん
20/01/19 09:11:24 M/ehGL7C.net
>>344
バイナリ配布のブツの例外発生元を何でコードで知りたいのかがわからん…
アドレスがわかったところでソースが無いわけやし……
何事かを言わんとするための想定に無理が有るのでは…
354:デフォルトの名無しさん
20/01/19 09:12:59 2MN/c8bt.net
タイミング依存の不具合を追跡する必要に迫られると、当然ながら対話デバッグはできない。
C++のprivate変数が不具合に関与しているとわかってもランタイムで値を見れないのは辛い。
他人様の作ったC++クラスヘッダーを一時的に書き換えてコンパイルする羽目に。
355:デフォルトの名無しさん
20/01/19 09:17:35 2MN/c8bt.net
>>346
例外が吐かれた後にできることなんてほとんどなくてもスタックをダンプできるだけでかなり助かる。
特に自分が作ったわけではないレイヤーでthrowされた時には、スタック情報が役立つ。
356:デフォルトの名無しさん
20/01/19 09:20:25 2MN/c8bt.net
公式がデバッグシンボルを配布するご時世なのに、C++のスタック仕様はそれについていけていない。
デバッガを介することなくスタックをダンプできる手段が制約されすぎ。
357:デフォルトの名無しさん
20/01/19 10:49:09 CSTVsvTH.net
gotoはRAIIと相性が悪いってのが端的だろ
これはgotoが悪いと言うよりc++の言語仕様上のgotoの扱いが悪いって話
constexprで使えないとか規格が新しくなる度に不都合が増えていくよ
358:デフォルトの名無しさん
20/01/19 10:57:40 RfLx+x9F.net
gotoの使い方くらい知っておいた方が良いかと
359:デフォルトの名無しさん
20/01/19 11:07:08.87 fzpRtoDi.net
>>350
相性悪い?
360:デフォルトの名無しさん
20/01/19 11:07:41.05 CSTVsvTH.net
文字列パーサー内とかでの状態遷移に使うは推奨する
その他でのgotoは代替手段があるし、そっちの方が言語サポート良いからgoto使うのはバカのやること
361:デフォルトの名無しさん
20/01/19 11:12:09.60 CSTVsvTH.net
まあ不遇な原因はgotoが自由すぎて前にも後ろにも飛べるせいだろうね
変数のデストラクタを呼ぶべきかどうかフラグ管理でもしないとコンパイラが判断できなくなる。
goto使うならその自由さが必要な場面でこそ使うべきなんだよ
362:デフォルトの名無しさん
20/01/19 11:18:58.21 2MN/c8bt.net
>>354
プログラミング言語の世界では、前や後ろという表現は直観的にわかりにくい。
前や後ろは相対的なものであり、バックしているイテレータにとっては前はバックなのだ。
上と下なら直観的にわかるだろう。
363:デフォルトの名無しさん
20/01/19 11:21:16.66 CSTVsvTH.net
用語としては前後で統一されているような
364:デフォルトの名無しさん
20/01/19 11:22:22.50 RfLx+x9F.net
gotoの使い方を知らない初心者がこのスレにいるってのが不思議
365:デフォルトの名無しさん
20/01/19 11:27:05.68 2MN/c8bt.net
[コラム] 正規表現の先読み/後読みは、どう考えても名前が悪いので、呼称禁止令を出してルックと気軽に呼んでみませんか。 - Qiita
URLリンク(qiita.com)
366:デフォルトの名無しさん
20/01/19 11:29:47.11 6oeBvQPN.net
>>357
誤魔化さない説明が
367:ちゃんとできるやつがずいぶん少ないという、残念な状況が今の日本だ
368:デフォルトの名無しさん
20/01/19 11:38:04.97 RfLx+x9F.net
わざわざ複雑にしてまでgotoを避ける
って宗教だよな
使いどころで使う
それだけ
369:デフォルトの名無しさん
20/01/19 11:42:59.02 ZzFAG3/g.net
いうて必要になったことないや
370:デフォルトの名無しさん
20/01/19 12:30:11.44 L2mlhsAt.net
別にgoto使っても使わなくても馬鹿が書けば複雑なコードになるだろ。
そういう問題じゃない。
そもそもc++の標準ライブラリが例外投げる時点でgotoとの相性は最悪だよ。
一番末端の関数で、副作用もないようなもの以外使えんわ。
371:デフォルトの名無しさん
20/01/19 12:36:07.26 PgEzQeWd.net
gotoおじさんはたぶん例外安全性という概念をわかってない
372:デフォルトの名無しさん
20/01/19 14:43:36 6jfPBIzz.net
>>363
例外安全の定義が難しいのですが、gotoを使っても例外安全を保障することはできると思うのですが、いかがでしょうか。
373:デフォルトの名無しさん
20/01/19 15:06:56.67 PgEzQeWd.net
>>364
c++の標準ライブラリに関して例外安全とは何かは定義されてる
できるできないで言えばgotoかつ例外安全はそりゃできるでしょうよ
まずgoto関係なしに例外安全が相当大変であることを理解してから出直してくれ
そうじゃなきゃRAII、autoなんとかmakeなんとかの有難みも理解できてないのよ
374:デフォルトの名無しさん
20/01/19 15:08:40.81 RfLx+x9F.net
話題のすり替え
375:デフォルトの名無しさん
20/01/19 15:16:49.04 PgEzQeWd.net
>>366
話題を勘違いしてるのはお前だよ
お前は単にbreakでスコープの脱出することに対してgotoの方が簡潔と言ってるんだろう
そういう場合があるのは同意するけど今回の話題はそれじゃない
スコープの脱出になってるのはRAIIでリソースを安全に開放する前提だからだ
だからお前が言うべきはスコープをなくしてgotoを使うというなら
合わせてリソースをどのように安全に開放するかを説明しないといけない
場当たり的でない方法でね
そこをまったく説明できない以上お前はgotoおじさんと呼ばれ続ける
376:デフォルトの名無しさん
20/01/19 15:20:52.99 fzpRtoDi.net
>スコープをなくしてgotoを使う
なんか言ってることが変だと思ったらこんな条件付けてたのか。ブロックスコープ使えばいいじゃん。
377:デフォルトの名無しさん
20/01/19 15:26:55.90 RfLx+x9F.net
スコープを無くしてgotoで解放?
なんじゃそりゃ?
スコープを抜けないと解放されないぞ
378:デフォルトの名無しさん
20/01/19 15:27:43.53 PgEzQeWd.net
断わっておくけど
>>295 に対してgotoおじさんが >>297 と言ったのが発端
後出しはしていない
ちなみに295を書いたのはおれではない
379:295
20/01/19 15:31:10.41 2MN/c8bt.net
どんな劣悪な環境でも動く do{ } while(0); こそ絶対正義。
380:デフォルトの名無しさん
20/01/19 15:33:51.15 RfLx+x9F.net
>>295は
do ループを抜けたすぐ下で資源を解放
って書いてあるように見えるけど
381:デフォルトの名無しさん
20/01/19 15:34:25.99 RfLx+x9F.net
>>370の勘違いってことでいいのかな?
382:デフォルトの名無しさん
20/01/19 15:42:01 PgEzQeWd.net
>>372
ああ確かに >>295 に対してってのは語弊があったかな
ID:cLOUBKze の発言を追ってみて
>>303
とかね
gotoおじさんかと思ったら別人なのね
383:デフォルトの名無しさん
20/01/19 17:03:31 6jfPBIzz.net
>>365
本来の「例外安全」の定義はもっと広い意味なのですが、あなたは、throwやcatchなどの「例外」が起きたときでもnewされたオブジェクトの削除などを行うという定義を採用されているようです。
break文を用いずにgoto文でブロックを脱出した場合でもオブジェクトは自動解放されるのをご存知ですか?
384:デフォルトの名無しさん
20/01/19 17:07:28 PgEzQeWd.net
>>375
自分は理解しているって言いたいわけね
じゃあさ >>273 のお題に対してgotoを使ったエレガントな方法を書いて
おれは思いつかないね
よろしく
385:デフォルトの名無しさん
20/01/19 17:11:06.93 4SQs66uE.net
そもそも一番のカスはこいつ >>276 >>286
386:デフォルトの名無しさん
20/01/19 17:42:21 fzpRtoDi.net
>>370
>>295に対して>>303が
{
387: goto label; } label: でいいんじゃないかってことかと。 逆にどう解釈してRAIIとか例外安全とか持ち出したのか気になる。
388:デフォルトの名無しさん
20/01/19 18:24:30 6oeBvQPN.net
論点を増やそうとするのは苦しいやつの習性だね
389:デフォルトの名無しさん
20/01/19 18:46:40 PgEzQeWd.net
>>378
それだとdo-whileと変わんないだろ
gotoおじさんの論点てそれか?
人の事クソバカ言ってるわりに何の優位性があるのかわからんな
390:デフォルトの名無しさん
20/01/19 18:52:29 6oeBvQPN.net
そうだよ、変わんないよ
複合文だけでできることになんでわざわざdoなんて面倒くせえもん使わなきゃいけねえんだよ
391:デフォルトの名無しさん
20/01/19 18:52:32 PM2cmccN.net
Rust使えばすべて解決。
392:デフォルトの名無しさん
20/01/19 18:53:23 6oeBvQPN.net
まさかとは思うがブレースを開くのにdoだかforだか何らかのキーワードが必要とでも思ってたか?
393:デフォルトの名無しさん
20/01/19 18:56:46 PM2cmccN.net
俺は何の実績もないおまえの言うことより、あわしろいくや氏を信じるけどな。
394:デフォルトの名無しさん
20/01/19 18:57:26 yjllCGTd.net
>>378
噂のgotoおじさまもさすがにこのコードがいいなんて言わないでしょ
395:デフォルトの名無しさん
20/01/19 18:59:17 6oeBvQPN.net
>>384
ブレースを開くのにキーワードが必要か否かに実績は関係ない
他人のネームバリューにすがるしかなくなったか?
396:デフォルトの名無しさん
20/01/19 19:00:40 PM2cmccN.net
>>386
ネームバリューは関係ないんだよ。
あわしろいくや氏は信用できる。
おまえは信用できない。
397:デフォルトの名無しさん
20/01/19 19:01:36 4SQs66uE.net
>>387
俺はお前のあわしろいくや氏は信用できるという言葉が信用できない
398:デフォルトの名無しさん
20/01/19 19:02:52 PM2cmccN.net
>>388
俺のことは信用しなくていい。
あわしろいくや氏を信じろ。
399:デフォルトの名無しさん
20/01/19 19:15:30 ocqIlbpk.net
売名乙
400:デフォルトの名無しさん
20/01/19 19:29:04.71 yQO+Nq01.net
まさか do while 構文が論点だと思ってたんかな?
まあ本当はgotoを推す正当性が全くなくてごまかしてるんだろうけれど。
てかgotoと例外安全性はかなり綿密に絡んだ話だろ。誤魔化しすぎだわ。
401:デフォルトの名無しさん
20/01/19 19:45:18 6oeBvQPN.net
>>387
ヒゲ生やした教祖様のために死刑になった信者と同じだなw
402:デフォルトの名無しさん
20/01/19 19:46:34 fzpRtoDi.net
>>380
そのくらいしか思いつかなかったが、>>297はその程度の主張だったんじゃないの?
じゃあどういう主張しているとID:PgEzQeWdは解釈していたのかな。そっちが気になる。
403:デフォルトの名無しさん
20/01/19 19:46:39 6oeBvQPN.net
> かなり綿密に絡んだ話だろ
誤魔化しすぎというブーメランが脳天に突き刺さってるぞw
404:デフォルトの名無しさん
20/01/19 19:54:00 yQO+Nq01.net
なるほど。。こりゃ話しても無駄だな。
405:デフォルトの名無しさん
20/01/19 20:25:44 M/ehGL7C.net
gotoと例外安全性がどう絡むのかわからんボスケテ;
406:デフォルトの名無しさん
20/01/19 21:06:11 fzpRtoDi.net
話しても無駄以前に、結局gotoと例外安全がどう関係するのか一言も出てこなかったな。
407:デフォルトの名無しさん
20/01/19 21:10:50 CSTVsvTH.net
RAIIとgotoは混ぜられないだろ
408:デフォルトの名無しさん
20/01/19 21:13:01 AinWVopR.net
そらgotoでリソース開放ルーチンに飛ぶようなCスタイルのプログラム書くと
例外飛んできたときに死ぬって話でしょ
(いくらC++にfinallyが無いからってgotoでリソース開放ルーチンに飛ぶのはダメ)
ただし元々の質問には関係ない話なんだがな
ところでC++にfinallyが無いのはちょっと良くないよね
今となってはラムダで自作できるようになったからいいけど
409:デフォルトの名無しさん
20/01/19 21:16:51 fzpRtoDi.net
>>398
その「混ぜる」って具体的にはどういうことを言ってるんだろう。
410:デフォルトの名無しさん
20/01/19 21:24:53 AinWVopR.net
基本的に break や return も生き先の決まった goto なので
余ほど変な使い方をしない限りRAIIと goto を混ぜれないって事はないよなぁ
むしろ RAII を使わないで goto でC系のリソース開放をしていた場合にハマるって話では
まぁでもこれは
do{
if( error ) break;
}while(0);
//開放処理
return;
でも同じことだし、元の質問には関係ないんだが
411:デフォルトの名無しさん
20/01/19 21:34:33 RfLx+x9F.net
まだやってんのか
>>377
それ
412:デフォルトの名無しさん
20/01/19 21:40:42 RfLx+x9F.net
do {
if(...) break;
} while (0);
よりは
{
if (...) goto label;
}
label:
の方が良い
という�
413:モ見に賛成 >>303ではないけど
414:デフォルトの名無しさん
20/01/19 21:44:50 RfLx+x9F.net
まあどっちでも大差ないけど
415:デフォルトの名無しさん
20/01/19 21:47:25.68 RfLx+x9F.net
{
{
if (...) goto label;
}
}
label:
これはbreakじゃ無理
416:デフォルトの名無しさん
20/01/19 21:57:15 RfLx+x9F.net
{
switch (...)
{
case ...: goto label;
}
}
label:
これも無理
417:デフォルトの名無しさん
20/01/19 22:11:05 ByUy1Erg.net
while(0)とか意味不明なコードよりgotoでスコープ抜ける方がはるかにシンプルだわな
418:デフォルトの名無しさん
20/01/19 22:15:20 RfLx+x9F.net
一応 do while(0) の使い方も覚えておいた方が良い
他人のコードを見たりマクロで使ったり
する事もあるだろうから
419:デフォルトの名無しさん
20/01/19 22:17:28 JMAoH3/H.net
普段のdo whileもwhile(0)って書くなど弊害が出るのでやめた方がいい
420:デフォルトの名無しさん
20/01/19 22:19:27 ByUy1Erg.net
ループするつもりもないのにループの構文使うのは悪手だと思う
421:デフォルトの名無しさん
20/01/19 22:27:26 RfLx+x9F.net
>>409
日本語で
422:デフォルトの名無しさん
20/01/19 22:33:02 fzpRtoDi.net
そこはまぁ、ループではあるけれども同時にbreakが使えるブロックでもあるわけで、
実際do-whileなんてほとんどがそういう使い方しかされていないわけだし。
ループできる構文でループしないのはbreakできる構文でbreakを使わないのと
同じようなものかと。
423:デフォルトの名無しさん
20/01/19 22:36:02 JMAoH3/H.net
>>411
do whileしてるのになぜか1回しか実行してないのに気付くのに時間がかかる
習慣で書くのでwhile(0)に気づけない
424:デフォルトの名無しさん
20/01/19 22:48:25 PgEzQeWd.net
こんなささいな違いは個人の好みでいいと思う派
do-while使わない派の言い分もわからなくもないが、
ソースを読む場合gotoだってgoto先を確認しないと意図が理解できないだろ
label名を考える必要があるのもちょっとめんどい
なのでこんなのどっちでもいい
ちなみにrust方式もブロックの先頭にラベル付いてるのは若干違和感覚える
425:デフォルトの名無しさん
20/01/19 22:50:45 RfLx+x9F.net
>>413
誰か解説よろしく!
426:デフォルトの名無しさん
20/01/19 23:07:09 Wel1D6/w.net
どっちのやり方でも構わないけど、リソース◯◯を自動解放するためのブロックだとか意図を示すコメントを付けておいてくれればそれでいい。
427:デフォルトの名無しさん
20/01/19 23:13:56.14 AinWVopR.net
↑だからその方法だと例外安全が・・・
C++だとリソース開放は RAII か finally かしか幸せになれない
428:デフォルトの名無しさん
20/01/19 23:17:22.36 RfLx+x9F.net
その方法
ってどの方法?
429:デフォルトの名無しさん
20/01/19 23:23:50.28 Wel1D6/w.net
>>417
誤解させたかもしれないから補足すると、どっちのやり方もと言ったのはただのブロックかdo whileかという話のことで、どちらにせよスコープを抜けて破棄されることを想定していた。
解放ルーチンにとばすことは端から考えてなかったよ。
430:デフォルトの名無しさん
20/01/19 23:47:54 L2mlhsAt.net
解放ルーチンにとばすくらいしかgotoの有用な使い方なんてねーだろ。
だからRAII、例外安全の話になってるわけだが
もう意地になって意味もわからずgotoにこだわってる馬鹿がいる。
431:デフォルトの名無しさん
20/01/20 00:05:06 ThUag/92.net
finally相当のデストラクタをラムダ式で渡すクラスのインスタンスを作ればいいじゃない、
で済まされてしまいそうだがやはりfinallyはあったほうがいい。
432:デフォルトの名無しさん
20/01/20 01:01:38.84 KvAer05C.net
「解放ルーチンにとばすくらいしかgotoの有用な使い方なんてねーだろ。」
って思えるぐらい、Cではこの技法が多用された
なぜなら真実は逆で
「gotoでとばすぐらいしか開放ルーチンをまとめる方法なんてねーだろ」
だったから多用された
A→Bでなくて、実はB→Aだったって話
なんだけど、あまりにもB→Aが多用されたから
数の暴力で逆のA→Bも成り立つと感覚的に思ってしまう
だが本当にそうだろうか、gotoに開放ルーチンに飛ばす以外の利用法は無いのだろうか
模索してみよう、というのがスレの流れ
スレがその流れになるのは自明で
何故ならC++においては「gotoで開放ルーチン」は例外安全の意味で完全な悪手になったから
初めから勘定に入らないし、考える意味もないし、議論の余地もない
他の利用方法を前提に話すのは当たり前で既定路線
433:
434:デフォルトの名無しさん
20/01/20 01:58:07 wNCym70P.net
スレの流れはvectorの動的な解放手段についてです
435:デフォルトの名無しさん
20/01/20 05:25:12.27 KSbNzMqr.net
Javaはgotoを無くした先進設計だからな。
436:デフォルトの名無しさん
20/01/20 07:11:09 SZK6NMcF.net
>>410
ほんこれ
メインフレーム時代から「なぜ0を足すんだろう」なんてあったけど
そういう謎コード書いて俺スゲーってやる厨二病は痛いよな
437:デフォルトの名無しさん
20/01/20 07:59:32 hWOi4sNW.net
つまりgotoと例外安全がどうとか言っていた人はこんなC時代の技法を念頭に置いていたわけか。
if (fail) goto FINAL;
FINAL:
後始末
gotoとRAIIの相性が悪い、混ぜられないという話はまた別なのだろうか。
438:デフォルトの名無しさん
20/01/20 08:30:41 ItoFGwWk.net
>>426が例外安全かどうかとgotoは関係ないんじゃない?
>>273と>>426のコードも関係ない
ただ例外安全て言いたかっただけと思う
439:デフォルトの名無しさん
20/01/20 09:55:56 SZK6NMcF.net
>>273
vector<usigned char> huge;
//do something
huge.clear();
gotoは全く関係ない
440:デフォルトの名無しさん
20/01/20 10:09:57 rZl1icD3.net
>>428
vector自体が確保したメモリが解放される保証がないのでNG
とっくに答えは書かれているのだから今からどやるのやめろ
441:デフォルトの名無しさん
20/01/20 10:14:06 SZK6NMcF.net
保証しないってどこに書いてあったっけ?
442:デフォルトの名無しさん
20/01/20 10:15:25 JGG/x92o.net
>>275
これで解決済みだよなぁ
std::vector<...>{}.swap(v)
443:デフォルトの名無しさん
20/01/20 10:15:47 N9WxJN6X.net
>>428
>>291,292辺りを見てこい
444:デフォルトの名無しさん
20/01/20 10:17:29 N9WxJN6X.net
もちろんclear()の仕様も確認しとけ
445:デフォルトの名無しさん
20/01/20 10:18:17 ThUag/92.net
>>292 で実装依存の最適化について言及がある。
あるサイズを超えるまではヒープではなくスタックを使うことで高速実行を期待する実装はあり得ると思う。
vectorの具体例は知らないが、EASTL::basic_stringはそうやってる。
446:デフォルトの名無しさん
20/01/20 10:40:56 SZK6NMcF.net
>>433
だから、どこに書いてあったのかと聞いているんだが
447:デフォルトの名無しさん
20/01/20 11:04:21 wNCym70P.net
>>431の言う空の一時オブジェクトとswapという常套手段で解決するのに質問者のクズは場当たり的などと難癖をつけ、
さらにじゃあnew/deleteしろよというまっとうな意見にバカを言うななどとほざいた結果がこのくだらねえ流れだよ
448:デフォルトの名無しさん
20/01/20 11:09:12 rZl1icD3.net
>>435
c++の規格書は有料だけど持ってんの?
ぐぐればstack overflowとかいくらでもひっかかるけど調べた?
これは割りと知られた仕様だと思うけどね
実際g++とかでやってみればわかるけどclearしてもcapacity変わんないから
449:デフォルトの名無しさん
20/01/20 11:14:14 wNCym70P.net
少なくともVC2019はclearでデストラクタが呼ばれてる
450:デフォルトの名無しさん
20/01/20 11:20:47 N9WxJN6X.net
>>438
それはvectorに格納した要素ごとのデストラクタの話であって、それらを格納するためにvector自身が確保した領域が解放されるわけではないだろ
451:デフォルトの名無しさん
20/01/20 11:29:18.51 SZK6NMcF.net
>>437
情報持ってるのに出してくれないのはわかったよ、無理にとは言わん
g++の挙動については情報ありがとう
452:デフォルトの名無しさん
20/01/20 11:53:45 JGG/x92o.net
むしろclearで解放せず、capacityが減らないことを保証してほしいよね
capacity減らす手段は用意されているのだから
453:デフォルトの名無しさん
20/01/20 12:32:03.74 xWGHAxxP.net
結局何を保証して欲しがってるのかさっぱりわからんが
言語仕様はvectorの何やらはもちろん、deleteだってfreeだって、OSにメモリ領域を確実にお返しになる事なんか保証してない事は覚えておこうな
454:デフォルトの名無しさん
20/01/20 12:33:54.17 RAANiraF.net
>>441
> capacity減らす手段は用意されているのだから
いや>>432はそれが確実じゃないって話だろ
まあそんな実装は
455:見たことないけど
456:デフォルトの名無しさん
20/01/20 12:52:13 JGG/x92o.net
>>443
いや空とswapすれば減るじゃん
457:デフォルトの名無しさん
20/01/20 13:22:01 hv8WW6TF.net
>>444
空とswapは場当たり的に見えて却下と質問者様がおっしゃったからこの論争になったんだぞ
458:デフォルトの名無しさん
20/01/20 13:22:46 SZK6NMcF.net
>>442
OSに返すかどうかの問題じゃねえだろ
allocatorが管理するサブプールに還元でもいいわけで
459:デフォルトの名無しさん
20/01/20 14:27:22 0GX6odYx.net
概出鴨試練蛾
do{...}while(0); と
{...} の違いって決定的なのは何かって
break; を入れられるかどうかだと思うんだけど
ループじゃないものに do{...}while(0); を使うのは可笑しいって派の人らは
後者に break; 入れられるようにしておけば良かっただけなんだよな
460:デフォルトの名無しさん
20/01/20 14:50:16 hv8WW6TF.net
ループする気もないのにループ構文を使うのは誤解の元
同様のことは他にもいくつも手段はあるのにループを使う必要がない
モダンな書き方だと[&](){...}();
461:デフォルトの名無しさん
20/01/20 15:02:12 KVDidwnp.net
違うだろ
while使わないよ派はgotoで充分だろ
ブロックを抜けるbreakが欲しいのは現状while使うよ派だろ
462:デフォルトの名無しさん
20/01/20 15:15:43 0GX6odYx.net
once{};
みたいな構文で良いんじゃね
マクロとか書けば
463:デフォルトの名無しさん
20/01/20 15:21:36 hv8WW6TF.net
マクロ()
ベターCとか03で脳みそ止まってんだろうなw
464:デフォルトの名無しさん
20/01/20 15:26:55.87 0GX6odYx.net
C++スレだからlambdaでも許されるけどCだと使えないやん?
465:デフォルトの名無しさん
20/01/20 15:29:38.41 hv8WW6TF.net
ほぉ、じゃあお前はCで使える文法のみでC++を書いてんだな
ボケてんのか?
466:デフォルトの名無しさん
20/01/20 17:52:26.33 SZK6NMcF.net
>>447
GOTO文有害説で言われる無条件分岐のスペルがbreakであろうとgotoであろうと同じことだ
同じ意味合いのことを書くために、ループでないものをループという嘘をつくことに俺は反対だ
467:デフォルトの名無しさん
20/01/20 20:28:01.32 KSbNzMqr.net
結局、gotoは使わないほうが良いのですか?
468:デフォルトの名無しさん
20/01/20 20:51:28.03 SZK6NMcF.net
{ から } までを1命令と読めるようにするのにgotoは無用と言っているに過ぎない
そのようにまとめようとしていないときやgotoを使っても1命令と読める場合にまで
GOTO有害説に囚われ強弁するのは何も分かってないやつのすることということだ
469:デフォルトの名無しさん
20/01/20 20:56:48.81 rZl1icD3.net
つまんないことに拘りすぎ
どっちでもええがな
470:デフォルトの名無しさん
20/01/20 21:36:31 hWOi4sNW.net
>>448
今だとdo-whileでループする方が誤解の元になりそうな。
471:デフォルトの名無しさん
20/01/20 21:38:12 jzGRQ/VP.net
#define BLOCK(stmt) do { stmt; } while(0);
BLOCK(
if (error) break;
);
472:デフォルトの名無しさん
20/01/20 21:53:50 IuISEeYy.net
do{}while(0)とか初めて見たけど
ダサすぎてそりゃ思いつかねーわwww
473:デフォルトの名無しさん
20/01/20 21:55:40 dqQuCzGx.net
結局goto有害説に流されないオレカッケーが言いたいだけだろ?
それでもgotoが有効な場面なんかないけどな。禁止にしても問題なんかない。
474:デフォルトの名無しさん
20/01/20 22:00:17.76 SZK6NMcF.net
GOTO有害説に流されるのがオレカッケーと思っているようだな
アホwバカwww
禁止にしたら問題あるからlongjmpやthrowができてきたんだよ
475:デフォルトの名無しさん
20/01/20 22:11:05 KSbNzMqr.net
つまり、使わないほうが良いのですね。
なんとなくですがわかりました。
476:デフォルトの名無しさん
20/01/20 22:12:08 SZK6NMcF.net
Javaから帰ってこなくていいからな
永久にバイバイ
477:デフォルトの名無しさん
20/01/20 22:30:44 dqQuCzGx.net
>>462
今時、例外の問題も把握してないでlongjumpとかthrowとか言ってんのか。。
馬鹿にもほどがあるわ。
負け確定だから泥仕合にしようってのはわかるがそろそろ引っ込めよ。
478:デフォルトの名無しさん
20/01/21 05:17:13 AnB6dumh.net
>>459
while(0)の後ろにセミコロン付けちゃダメ
479:デフォルトの名無しさん
20/01/21 07:25:59 XinnYwlJ.net
>>465
GOTO有害説に流されているという指摘は否定しないんだな?w
480:デフォルトの名無しさん
20/01/21 08:47:12 pAPT/+0o.net
>>459
定義部 { stmt; } のセミコロンも不要かな。
プリプロセッサを通した変換結果を見て気付いた。
って言うか、関数形式マクロの実引数に
空白とかカッコとかを含めることができるのね。
481:デフォルトの名無しさん
20/01/21 08:50:21 liyEgHWj.net
>>468
確かカンマも使えないはずだし、>>459のマクロは使い勝手は悪く制御構造も隠蔽する有害な使い方だろう。
482:デフォルトの名無しさん
20/01/21 09:35:24 ecU7KawI.net
gotoを使わないことが目的になって
余計分かりにくくしてるアホな例
483:デフォルトの名無しさん
20/01/21 09:49:43 Hkcle0K4.net
goto論争はくだらない
一方でラムダ使ったループ脱出は議論の余地がある
これがエレガントに見えるのか
パズルに見えるのか
自分の場合どちらかといえば後者
ラムダ自体は多用するけど
484:デフォルトの名無しさん
20/01/21 11:17:56 Sppu2iw7.net
盲目的にgoto=悪と信じて、かえって読みずらいコード書く奴ってほんとアホだよなあ
485:デフォルトの名無しさん
20/01/21 13:51:41 XinnYwlJ.net
>>470
ほんこれ
486:デフォルトの名無しさん
20/01/21 13:54:41 XinnYwlJ.net
gotoの何が悪いのかわかってないやつをもう少しいたぶってやろうと思ってたけど
途中で可哀想になってきて答え書いてやってるのになあ。。。
487:デフォルトの名無しさん
20/01/21 18:52:44 xueGtX5x.net
>>460
do { } while(0)
は自分は見たことがある。
忘れてしまったが、確か、#define マクロの定義部分で使われていて、目的は、
マクロ全体が一つの分の用に実行されて欲しいことであったようだった。
#define マクロ名() do {\
・・・\
・・・\
} while(0)
のような感じだったと思う。
これなしで裸で書くより安全になる場合があった気がする。
488:デフォルトの名無しさん
20/01/21 18:57:29 fxsKQzaN.net
if (...) マクロ();
else ...
489:デフォルトの名無しさん
20/01/21 18:57:46 xueGtX5x.net
>>475
忘れてしまったが、おぼろげながら何か以下の様なことに関連していたような記憶がある。
C/C++では、if 文の直後は {}がなくても書くことが出来てしまう。
それで、
if (条件式)
マクロ関数名();
のように書いた場合、マクロの定義部を単なる {} で書くより安全な場合があったような
気がする。
忘れた。
490:デフォルトの名無しさん
20/01/21 19:00:56 xueGtX5x.net
>>476
あ、その場合だね、多分。
#define aaa() {・・・}
と定義してしまった場合、
if (...) aaa();
else ...
と書くと、
if (...) {};
else ...
と展開されてしまい、else の部分がエラーになってしまう。ところが、
#define aaa() do {・・・} while(0)
と定義していると、
if (...)
do {} while(0);
else ...
と定義されて、正しく動作する。
491:デフォルトの名無しさん
20/01/21 19:03:11 xueGtX5x.net
URLリンク(stackoverflow.com)
↑に書いてあった。
492:デフォルトの名無しさん
20/01/21 19:11:44 jtyzl32v.net
それは11年前のネタだからそうなってるけど現代C++ならラムダ式で書くべき内容
493:デフォルトの名無しさん
20/01/21 19:19:17 fxsKQzaN.net
マクロでしか書けない物もあるんだよ
494:デフォルトの名無しさん
20/01/21 19:19:18 jXO8TLK9.net
大昔の工芸品みたいやな
495:デフォルトの名無しさん
20/01/21 19:24:51 fxsKQzaN.net
ていうかなぜラムダ式?
考える順は以下じゃない?
関数
インライン関数
テンプレート関数
マクロ
496:デフォルトの名無しさん
20/01/21 19:35:47 jtyzl32v.net
>>483
そこで回答されている
#define FOO(x) do { foo(x); bar(x); } while (0)
は
#define FOO(x) [&] { foo(x); bar(x); } ()
と簡潔に書ける
そのQAの内容は今のC++におけるdo-while(0)の有用性を示す内容ではない
497:デフォルトの名無しさん
20/01/21 20:01:36.85 fxsKQzaN.net
ああ、そういうことか
do while に対するメリットがないと
互換性から do while を選ぶことになりそう
498:デフォルトの名無しさん
20/01/21 20:17:22 V9u70PsA.net
ラムダ式はc++11からか
使えない環境は結構あるんだろうな
近付きたくない
499:デフォルトの名無しさん
20/01/21 20:20:59 m86EWX9f.net
>>484
最適化前提にしないと代替とは言えない�
500:ヒ
501:デフォルトの名無しさん
20/01/21 20:21:55 OieZoAm+.net
そんな用途でマクロなんか使わねーわ。ばかか。
502:デフォルトの名無しさん
20/01/21 21:35:08.93 XinnYwlJ.net
スコープが効かねえ毒だかんな
503:デフォルトの名無しさん
20/01/21 22:01:33.56 fxsKQzaN.net
>>481
504:デフォルトの名無しさん
20/01/21 22:03:37.86 XinnYwlJ.net
__LINE__がいるのとかな
505:デフォルトの名無しさん
20/01/22 00:05:18 LIwEls05.net
>>484
JavaScriptだとそうかいても速度差がないかもしれないけど、C++だと、
そう書いた場合は、関数を定義してから、マシン語の call 文でその関数が
呼び出されるので結構なオーバーヘッドとなる。
JavaScriptの場合は、どう書いてもオーバーヘッドがあるからそのくらいの
オーバーヘッドは体感速度に登ってこないのでどっちでも良いだけ。
506:デフォルトの名無しさん
20/01/22 00:20:06 2biZgMt+.net
>>492
ラムダ式はインライン展開されるからオーバーヘッドにはならない
507:デフォルトの名無しさん
20/01/22 01:14:20 eHIdhO0H.net
error: no member named 'emplace_back' in 'std::__1::vector<int,
std::__1::allocator<int> >'; did you mean '__emplace_back'?
v.emplace_back(d);
^~~~~~~~~~~~
__emplace_back
/Library/Developer/CommandLineTools/usr/include/c++/v1/vector:696:10: note:
'__emplace_back' declared here
void __emplace_back(const value_type& __x) { push_back(__x); }
^
1 error generated.
push_backは普通に使えるんですけどemplace_backは何故か上記のようなエラーが出てしまいます
一応コンパイラに言われた通りに__emplace_backに変えれば動きはするんですが、普通にアンダーバーなしで
動かすにはどうしたらいいんでしょうか。環境はmacの10.14です。
508:デフォルトの名無しさん
20/01/22 01:26:38 2biZgMt+.net
>>494
OSだけ書かれても環境がわからんけどこれに見える
URLリンク(cpprefjp.github.io)
509:デフォルトの名無しさん
20/01/22 09:21:16 RBeGE/46.net
>>493
それ保証されてる?
最適化オフでは関数オブジェクトのままじゃないの?
最近のc++はデバッグビルドが使い物にならないことが多くてマジ困る
510:デフォルトの名無しさん
20/01/22 09:24:55 dJnLloAw.net
>>496
最適化するかしないか自分で選べるんだから、言語のせいじゃないと思うんだ。
511:デフォルトの名無しさん
20/01/22 09:47:45 s6VTVCIo.net
最近というか昔からだなデバッグまわりがクソなのは
ほんと標準化プロセスは現実のプロダクト開発に関わったことのない言語オタクの遊び場に見えるわ
デバッグをないがしろにするなと
>>497
端的にテンプレートが原因だから言語のせい
というか誰のせいかどうでもいいから解を提供しろと
512:デフォルトの名無しさん
20/01/22 10:28:10 dJnLloAw.net
>>498
最適化設定を変えることが解になると思って言ったんだけど、そうはいかないことがあるの?
デバッグまわりがクソだと言うなら、相手はまずコンパイラ&デバッガのベンダであって、言語の標準化は
あんまり関係なくね?
513:デフォルトの名無しさん
20/01/22 10:34:22 Oj6zQLXh.net
インライン展開するかどうか含めて
最適化はコンパイラ依存
パフォーマンス測定やチューニングは
実際の環境でやらないと
可能性で言えばマクロが一番インライン展開の可能性が高い
(コンパイラが賢すぎて同一コードを共有するとかない限り)
514:デフォルトの名無しさん
20/01/22 10:50:51 kHABv+Er.net
マクロはソースの字面を読み替えるだけ
機械語の命令シーケンスを開いたサブルーチンにするインライン展開とは全く別な話
515:デフォルトの名無しさん
20/01/22 12:06:37.54 OzkwmLpy.net
>>500
マクロは、C
516:言語の時代から「前処理(preprocess)」として処理され、 コンパイル作業が入る前にその場にトークンとして展開されるだけと 仕様で決まっています。勝手に関数になる可能性はほぼ0です。
517:デフォルトの名無しさん
20/01/22 12:28:55 S75Q14iC.net
挙動が仕様通りになるならコンパイラは何やってもいいんだよ(と仕様で決まってる)
マクロだったものに関数呼び出しを仕込むのもコンパイラの自由だ
実際同じ処理の塊があっちこっちに出てきたらまとめて関数(みたいなもの)にするコードサイズ最適化は普通にやる可能性がある
518:デフォルトの名無しさん
20/01/22 12:40:53 Oj6zQLXh.net
>>501
オーバーヘッドを語ってるんだから
どういう手順でバイナリになるかは関係ない
バイナリになった状態が全て
>>502
>>500にそう書いてるけど
519:デフォルトの名無しさん
20/01/22 13:12:02.54 kHABv+Er.net
>>504
マクロ展開は最適化が始まる前の話だつってんだよ、わかんねーやつだな
#define a(b,c) b * 2 + c * 2
a(x, y) //これは
x * 2 + y * 2 //こうしろというだけの指示で
(x + y) * 2 //このような変形は意味していないし
してはならない
a(x, y) * z //こういうとき困るだろうが
520:デフォルトの名無しさん
20/01/22 13:18:49.85 kHABv+Er.net
インライン展開されるかどうかは、そのコード片がマクロの展開結果かどうかには関係ないってことだぞ
こんなこと、いちいち言わなきゃわからんようだから付け足しておく
521:デフォルトの名無しさん
20/01/22 13:34:41.13 S75Q14iC.net
>>505
最適化をいつ始めるかなんてそれこそコンパイラ次第なんだけど
522:デフォルトの名無しさん
20/01/22 13:41:29 yb939hMs.net
つまりマクロはインライン展開されやすいという主張は引っ込めるわけだな
523:デフォルトの名無しさん
20/01/22 13:43:39 yb939hMs.net
都合悪くなると
どうせいつもの手で逃げるだろうけどな
尻尾巻いたやり取りは残るぜ
524:デフォルトの名無しさん
20/01/22 14:44:17 54HMiZ6v.net
>>505
#define a(B,C) ((B) * 2 + (C) * 2)
>>498
>ほんと標準化プロセスは現実のプロダクト開発に関わったことのない言語オタクの遊び場に見えるわ
ほんそれ
525:デフォルトの名無しさん
20/01/22 14:49:21 kHABv+Er.net
>>510
それはおまえさんの勝手な思い込みだよ
x * 2 + y * 2 * z
という結果を意図して使うこともできるのは
マクロに特有の機能で今さら変更できなくなっている
526:デフォルトの名無しさん
20/01/22 14:51:21 54HMiZ6v.net
意図して出来るのは知ってるが
敢えてやらないんだよ
527:デフォルトの名無しさん
20/01/22 15:11:37.83 s6VTVCIo.net
>>499
デバッグのために最適化切ると激遅になる問題が散見されるという問題にたいして
最適化設定を変えるという解がナンセンス
そりゃpragma駆使して手で細かく切り替えりゃ可能だろうがそんなことやってられない
528:デフォルトの名無しさん
20/01/22 15:11:48.33 kHABv+Er.net
オマエガナー(aary
529:デフォルトの名無しさん
20/01/22 15:13:12.36 kHABv+Er.net
>>512
おまえが510で持ち出したような括弧が自動的に付くような規格改定が行われない理由を考えたことがあるか?
530:デフォルトの名無しさん
20/01/22 15:13:39.10 Oj6zQLXh.net
>>505
多分比較してる内容が噛み合ってない
マクロを展開した結果と直接記述と
が同じなのは当然
プリプロセッサなわけだから
そうじゃなくて
マクロ、インライン関数、通常の関数の比較の話
当然最適化の期待度は
マクロ(直接記述)>インライン関数>通常の関数
531:デフォルトの名無しさん
20/01/22 15:18:02.26 Oj6zQLXh.net
>>505
そもそも最適化ですらない話を持ち出してるのか
話の流れと全く関係ないですね
532:デフォルトの名無しさん
20/01/22 15:32:14.07 s6VTVCIo.net
>>499
ベンダの責任っていうのは一見もっともでそれがまさにc++標準化メンバーのスタンスだ
でも例えばお前はSFINAE関連のデバッグどうやってるよ?
いくつかツールはあるが導入が難しいか頼りないものばかりだ
そんな状況がずっと続いている
このあたりが改善するには言語コアを設計する時点からどんなデバッグ機能が必要か考えるべきってのがおれ�
533:フ主張 作業フローを理解しない人が無邪気にこれが入ればさらにソースコード短く書けまっせレベルの議論で機能追加を考えるべきでない
534:デフォルトの名無しさん
20/01/22 15:34:50.28 2biZgMt+.net
機能を使うかどうかはお前の判断でお前の責任
勝手に機能使っておいて八つ当たりすんな
535:デフォルトの名無しさん
20/01/22 15:50:53.24 LkBGzo9o.net
>ほんと標準化プロセスは現実のプロダクト開発に関わったことのない言語オタクの遊び場に見えるわ
+1
536:デフォルトの名無しさん
20/01/22 15:53:26.36 2biZgMt+.net
江添みたいなのしかいない日本と違って、普通の国の委員は企業の代表として参加しているのでその指摘は的外れ
537:デフォルトの名無しさん
20/01/22 15:57:43.58 OzkwmLpy.net
>>503
関数になっているものを inline 展開する処理系は多数ありますが、
プログラマがせっかく展開して書いてあるものをわざわざ関数に戻す処理系
はめったにないのです。
また、そのような最適化は人間には簡単に思えるものですが、機械にやらせようと
するととても大変です。マクロ展開される前のマクロ関数の状態ならまだ
できるのですが、コンパイラの中で最適化層と前処理層がかけ離れた位置に
あるので、もしやりたければ最適化層だけでそれをやることになり処理がとても重くなります。
まず、コンパイル後に出来上がった中間コードのなかから同一のパターンを見出すのが
ものすごく時間が掛かります。それから全く同じではない場合への対処が機会は苦手です。
538:デフォルトの名無しさん
20/01/22 15:57:58.58 kHABv+Er.net
>>516
最後の2行とそれ以前が論理的に繋がってないぞ
539:デフォルトの名無しさん
20/01/22 15:58:35.89 kHABv+Er.net
>>517
506で牽制しておいたはずなんだが
言わなきゃわからんのではなく、
言ってもわからんやつのようだな
540:はちみつ餃子
20/01/22 18:28:00.61 lnnB9FBg.net
>>516
> 当然最適化の期待度は
> マクロ(直接記述)>インライン関数>通常の関数
現代のコンパイラの最適化機構はかなり複雑で、どのように最適化が効くか予想するのは無理。
素朴な処理系ならなんらかの傾向がある場合もあると思うけど、一般化できるような話ではないよ。
普通の関数はインライン関数より呼び出しのコストは確かに大きいけど、
全体のコードサイズが大きくなるとキャッシュメモリからあふれやすいといった話もあって、
トレードオフになってる要素がある。
それに、主要なコンパイラは inline キーワードで修飾してもしなくてもインライン化が効果的ならインライン化するし、
効果的でないならしないよ。
inline 関数として定義すれば各コンパイル単位の中に必ず定義もあるわけだから、
LTO が有効ではない状況では結果的にインライン化しやすい条件がととのっているとは言えるんだけど、
逆に言えば LTO を有効に出来るならどうでもよくなるわけだし。
いずれにしても、そんな微々たる速度が気になるような場合ってそんなにあるか?
速度が問題になってから実測しろよ。
状況によってどうとでもなるんだから、具体的な状況を示さずにどれが速いとか言ったってかみ合うわけないだろ。
541:デフォルトの名無しさん
20/01/22 18:44:11.63 0ayd3B3Q.net
>>525
一般的な期待度の話
当然例外はある
コンパイル単位が別で
関数を定数パラメーターでコールした場合
なんかが差が大きくなる
レジスタ退避やスタックポインタのアラインメント調整、スタック拡張、AVXの準備関数コール
もそれなりにオーバーヘッドとなる
同じコンパイル単位であれば
今のコンパイラではそれほど差は出ないが
組み込みのチープなコンパイラもまだまだ使われている
542:
20/01/22 19:06:41.58 RZgzSQWe.net
>>501
お前さんは LISP のマクロを知らないのか?
543:デフォルトの名無しさん
20/01/22 19:17:53.96 2biZgMt+.net
544:LISPの仕様がC++と何か関係ある?
545:デフォルトの名無しさん
20/01/22 20:23:02 OSofFadI.net
関数とマクロの違いがlispだとわかりやすいから。
わかってないやつをあぶりだすのにはちょうどいい。
546:デフォルトの名無しさん
20/01/22 20:38:48 F1N+c+gr.net
マクロアセンブラのマクロは強力
547:デフォルトの名無しさん
20/01/22 21:16:42.45 kHABv+Er.net
>>527
で?
548:デフォルトの名無しさん
20/01/22 22:55:42 PNeen3jP.net
LISPじゃー
LISPの場合はー
www
549:デフォルトの名無しさん
20/01/22 23:00:35 Ab6Q02+v.net
QZが現れると大抵話が脱線するから放置しとこう。
550:デフォルトの名無しさん
20/01/23 02:42:18 96Ez/jHv.net
>>518
よくわかんないので、SFINAEなりConceptなりconstexprなりをデバッグに配慮して設計していたら
どう問題を改善できていたと思うのか、教えて。
551:デフォルトの名無しさん
20/01/23 05:39:34 ZM0XhcNb.net
(CMakeスレがないっぽいので)
target_link_libraries(a.exe PRIVATE ${MPI_CXX_LIBRARIES})
↑${MPI_CXX_LIBRARIES}が定義されていなくても合法で、その場合何ともリンクしないということを期待してもOK?
それとも
if(MPI_FOUND) target_link_libraries(...) endif()
とすべき?
公式を見てもよく分からない
552:デフォルトの名無しさん
20/01/23 07:08:06 Y+bt1zIi.net
>>535
こちらでどうぞ
スレリンク(tech板)
553:デフォルトの名無しさん
20/01/23 09:24:40 cHzm9I9L.net
>>534
デバッグに配慮してたらそんな糞機能入れないだろうね。
554:デフォルトの名無しさん
20/01/23 10:15:54 77XEoAHk.net
今日もgotoを使ってしまった・・・
555:デフォルトの名無しさん
20/01/23 10:22:15.42 KV664nBl.net
>>534
まず現在の問題の構造を考えて欲しい
c++はtemplateを使ってメタプログラミングを行うのはご存知の通り
でtemplateはチューリング完全だ
それだけの複雑さを持っている
それに対して一般人がやるデバッグはコンパイルが通って期待通り動くかエラーメッセージを見るかぐらいだろ?
これは原始的なprintfデバッグを行っているのと同じレベル
なのでまずストレートに考えると
メタプログラミングの結果が取得できること
コンパイラにデバッガ接続可能にしてメタプログラミングの実行がトレースできること
が必要
これがベストなのかはさておき、メタでないプログラミングでは当たり前なんだから
SFINAEをどうするかみたいな話の前にまずこういうところを整備すべきだった
ハードウェア依存じゃないのだから標準モデルを定めるのは可能だ
556:デフォルトの名無しさん
20/01/23 10:45:58 77XEoAHk.net
gotoを受け入れるとクリーンでわかりやすい実装が開ける。
・・・かもしれない。
557:デフォルトの名無しさん
20/01/23 10:47:36 96Ez/jHv.net
>>539
> メタプログラミングの結果が取得できること
> コンパイラにデバッガ接続可能にしてメタプログラミングの実行がトレースできること
> が必要
あったらいいなとは思うけど、必要(=可能になるまで機能を使わせるべきではない)とは思わないなぁ。
実行時プログラムについて言語規格側でデバッグのための特別な「標準モデル」が定められたりいてないけど、
現状でわりと使えるデバッガができてるし、コンパイラはあるけどデバッガは無いという環境や時代はあったし。
メタプログラミングだからといって機能追加に先立って特別な定めが要るという理屈はよくわからない。
558:デフォルトの名無しさん
20/01/23 11:24:46 Y+bt1zIi.net
>>540
470, 472も言っているが
gotoを使わないこと自体が目的化してはいけない
そういうアホがbreakは平気で使ったりする
559:デフォルトの名無しさん
20/01/23 11:27:54 y5HKK+ir.net
constexpr関数内でgoto使えないのだから、gotoを避けることを目的とせざるを得ない場面はある。
560:デフォルトの名無しさん
20/01/23 11:28:08 77XEoAHk.net
breakとgotoを同一視するのも問題なのでは。
561:デフォルトの名無しさん
20/01/23 11:28:57 Y+bt1zIi.net
>>544
同一視ってGOTO有害説の中では完全に同じだよ
562:デフォルトの名無しさん
20/01/23 11:31:15 y5HKK+ir.net
goto有害説ではbreakとgotoは違うもの扱いしているよ
breakで出来ないことがgotoで出来ること自体を問題視しているのだから
563:デフォルトの名無しさん
20/01/23 11:31:46 77XEoAHk.net
誰かそんな説を唱えたのでしょうか。
564:デフォルトの名無しさん
20/01/23 11:32:55 77XEoAHk.net
責任者出て来ーーい!!!
565:デフォルトの名無しさん
20/01/23 11:33:01 Y+bt1zIi.net
>>546
ほう、どう違う扱いをしているんだ?
566:デフォルトの名無しさん
20/01/23 11:34:43 y5HKK+ir.net
gotoは使わないけどbreakは使うってのがgoto有害説じゃないの?
完全に別の扱いしているってことだろ
567:デフォルトの名無しさん
20/01/23 11:35:44.43 77XEoAHk.net
ぐ、ぐ、ぐぅの音も出ない。
568:デフォルトの名無しさん
20/01/23 11:42:15.74 Y+bt1zIi.net
>>550
全然違う
まだ答えは書いてやらんぞ
569:デフォルトの名無しさん
20/01/23 12:29:41 nmx8CMX3.net
>>546 も >>539 も同じタイプの馬鹿
選択の幅は広い方がいい
機能の存在を否定するのではなく、単にお前が使わなければいいだけ
570:デフォルトの名無しさん
20/01/23 13:56:33 VWfJLmDE.net
>>533
+1
ほんそれ
571:はちみつ餃子 ◆8X2XSCHEME
20/01/23 14:47:05 QRqIx1i6.net
break でも goto でもそれを使わなかったときにもっと複雑になるのなら使っていいよ。
クソみてぇなフラグを立ててループから抜けるよりは break の方がマシだろ?
使わなくても十分に良いなら使わない方がいいに決まってるけど、要るときに使わないのは馬鹿げた話。
現実にはクソな道具が役に立つクソな状況があるんだよ。
572:デフォルトの名無しさん
20/01/23 15:47:36 tCbubFOj.net
do{...}while(0);
とかにしたくないとき
while(1){
...;
...;
break;
}
もたまに意図的に使う
573:デフォルトの名無しさん
20/01/23 16:22:12 77XEoAHk.net
なにこれ悪行自慢。
574:デフォルトの名無しさん
20/01/23 16:34:07 Y+bt1zIi.net
>>556
breakしなかった場合の動作が違うじゃねえかよ
575:デフォルトの名無しさん
20/01/23 16:47:49 nmx8CMX3.net
>>556
switch(1){
default:
}
576:デフォルトの名無しさん
20/01/23 16:49:27 77XEoAHk.net
通報しました。
577:デフォルトの名無しさん
20/01/23 17:36:57 y5HKK+ir.net
forやwhileもgotoのシンタックスシュガーだから使うなみたいな
578:デフォルトの名無しさん
20/01/23 17:43:18 y5HKK+ir.net
gotoって自由すぎて対応するlabelの場所によって意味が変わるから、自由に飛びたいとき以外に使うと分かりづらくなる。
breakやcontinueなら一連の処理の一部を飛ばすって意図がそれだけでわかるのだから、do{}while(0)だとgoto使うのと何を分かりやすくするかでトレードオフになる
579:デフォルトの名無しさん
20/01/23 17:47:15.54 Y+bt1zIi.net
do{} から以後が、それまでの話と繋がってねえぞ
それから break と continue のGOTO有害説における違いもわかってねえな
580:デフォルトの名無しさん
20/01/23 17:51:51 y5HKK+ir.net
do while(0)+breakを使う->loopだと誤解する可能性がある
gotoを使う->labelの飛び先見ないと意図がわからない
ってどちらの分かりづらさを大きな問題とするかで、どちらが良いかの好みが別れる
これがトレードオフ
581:デフォルトの名無しさん
20/01/23 17:53:42 y5HKK+ir.net
まあdo while(0)と組み合わせるならcontinueの方が良い気もする
やっぱりretryしようと思ったときのために
582:デフォルトの名無しさん
20/01/23 18:00:56 AdSJ3UeH.net
>>562
C++自体自由過ぎるから使わない方が良いぞ
583:デフォルトの名無しさん
20/01/23 18:04:36 y5HKK+ir.net
自由だから使い所はその自由度が必要なときってだけなのだが。
forのかわりにgotoでループさせる奴は正気じゃない
584:デフォルトの名無しさん
20/01/23 18:12:02.33 AdSJ3UeH.net
関数もどこに飛ぶかわからないから
使いどころは必要な時だけだな
ポインタも同じ
585:デフォルトの名無しさん
20/01/23 18:52:22.63 77XEoAHk.net
関数はgotoと同じ。
586:デフォルトの名無しさん
20/01/23 19:01:50.07 77XEoAHk.net
>>566
やはりこれからはRustですか。
587:デフォルトの名無しさん
20/01/23 19:09:24.45 nmx8CMX3.net
>>570
そうだよ
さようなら
588:デフォルトの名無しさん
20/01/23 19:19:26.28 5iKgMbK4.net
>>588
後者のbreakはifが付いてないので絶対breakするというなら一緒だが
しかし途中のどこかでcontinueが掛かれていると動作が変わる
589:デフォルトの名無しさん
20/01/23 19:21:21.59 5iKgMbK4.net
なぜか変なところへ安価が・・・
>>558
後者のbreakはifが付いてないので絶対breakするというなら一緒だが
しかし途中のどこかでcontinueが掛かれていると動作が変わる
590:デフォルトの名無しさん
20/01/23 19:22:06.67 77XEoAHk.net
goto駆使してcoroutineというパターンは。
591:デフォルトの名無しさん
20/01/23 19:22:49.44 nmx8CMX3.net
ループする気がないのにcontinueが入る可能性があるのか?
やっぱループ構文をループ以外の目的で使う奴はアホだわ
592:デフォルトの名無しさん
20/01/23 19:23:30.77 5iKgMbK4.net
>>564
どうでもいいが
do{}while(0);+continue;でもっと難読化するかも知れない
593:デフォルトの名無しさん
20/01/23 19:27:33.29 77XEoAHk.net
>>552が答えを書かないのだが。
もしかして答えなんて持っていないのでは。
594:デフォルトの名無しさん
20/01/23 19:32:56.95 rYLpH2kU.net
function();
何をするかわからないから関数は使うべきじゃない
pointer;
何を指し示すかわからないからポインタは使うべきじゃない
595:デフォルトの名無しさん
20/01/23 19:36:22.66 5iKgMbK4.net
>>565 に聴いてくれ
596:デフォルトの名無しさん
20/01/23 20:36:00 Y+bt1zIi.net
>>577
あとで、しまったと思ったんだが
もう答えを書いてしまっていた
今んとこ、まだ伏せておきたいので
どこなのかは書かないから
自分で探せ
597:デフォルトの名無しさん
20/01/23 22:32:03.65 bkVRGJlU.net
>>553
とかいいつつ古い仕様の範囲で実用してる人をバカにして
マウント取って憂さ晴らしするんですねわかります
598:デフォルトの名無しさん
20/01/23 22:33:01.52 glYn/cGw.net
つまりCPUはgotoの嵐だからクソと
599:デフォルトの名無しさん
20/01/23 22:54:05.78 nX/KPrtD.net
>>564
どうせdo-whileなんて本来のループとして使うことはまずないんだから、あとは
ローカルルールとしてwhile(0)以外禁止とかにすれば十分かと。
600:デフォルトの名無しさん
20/01/23 23:13:19.41 HgduJel4.net
gotoは高級の中にいきなり低級なことぶちこむから違和感あるんだろ
場当たり的で美しくないね
601:デフォルトの名無しさん
20/01/23 23:28:17.91 2vcw1hg/.net
まえにSQLパーサを書いたときはgotoがすごく便利だった。
文法をそのままソースに反映できる感じ。
goto嫌いな人たちはどうやって書くのか見てみたい。
602:デフォルトの名無しさん
20/01/23 23:35:42.82 M8BvdbFC.net
そういえば、まだ構造化されてない昔のBASICは、構造化された今のBASICより人気があったのではないかと思うけど、行番号と goto 文の組み合わせはラベル名を考えなくて済むので便利であった。
そして、BASIC言語は分かり易くて易しい言語と言われていたのだから、goto文自体はそんなに理解や扱いが難しいものではない。
ただし、フローチャートを書いてから組まないと分かりにくいことがあったかも知れない。
逆に、今フローチャートを書く必要がある場面は少なくなったのはgoto分を使わずに書けるようになったからかも知れない。
603:デフォルトの名無しさん
20/01/23 23:41:23.96 cHzm9I9L.net
ここまで無理やりな擁護してまで使うほどの機能じゃねーだろバカか。
604:デフォルトの名無しさん
20/01/23 23:43:47.47 LWLbtpQ/.net
gotoとかマクロとか話題に加齢臭漂ってるぞ
もうちょっと食いつく話題選べよ
605:デフォルトの名無しさん
20/01/24 00:03:07.60 M35o3kEk.net
>>585
普通にテーブル駆動では。
606:デフォルトの名無しさん
20/01/24 01:08:48.99 nZbbrzXe.net
ma
607:in関数が呼び出される前にグローバル変数が初期化されますが、 これの初期化順を変更することは可能なのでしょうか?
608:デフォルトの名無しさん
20/01/24 01:09:21.02 /4mdgZLq.net
A、B、Cと言う順序で実行されるべき処理が
A、B、Cと言う順序で実行されれば良いのであって
それが上からA、B、Cの順で書いてあろうが
B, A, Cと書いてあるのをgotoでA、B、Cの実行順にしようが
スレッド1、2、3が同期をとりあってそれぞれA、B、Cの順で実行しようが
相違なるコールバック1、2、3がこの順で呼ばれるように仕組まれた上でそれぞれA、B、Cを実行しようが
B、Cの実行がラムダ式で書かれていてその定義がAより上にあってAの実行後に呼び出されようが
ぜんぜん問題ではない
609:デフォルトの名無しさん
20/01/24 01:10:48.48 /4mdgZLq.net
一方gotoなど使わなくとももっと酷い糞はいくらでも作れるのだから
gotoが駄目だと言い張る奴は精神が弱って
いるな!
610:デフォルトの名無しさん
20/01/24 01:12:30.02 f1L6KzBl.net
いや普通にA,B,Cの順で書けよ。
611:デフォルトの名無しさん
20/01/24 01:15:32.35 eYFKJ4zI.net
>>590
同じ翻訳単位にあれば上から
異なる翻訳単位のグローバル変数の初期化順序は未定義
612:デフォルトの名無しさん
20/01/24 06:17:01 z1Jr3gge.net
>>590
やり方としては >>594 のとおり。
「同じ翻訳単位」とは要するに1個のソースファイルってことね。
でも一般的には「グローバル変数の初期化順序に依存すべきではない」
はずだけど、初期化順序を制御したい事情に興味があるわ。
もっと一般的には「グローバル変数を使うべきでない」だけど、それは別のお話。
613:デフォルトの名無しさん
20/01/24 06:24:04 3pA3r7pN.net
初期化順序を制御したい事情なんていくらでもあるだろ
そういう事情があるにも関わらず
明示的な初期化処理で初期化しないのが問題なのであって
614:デフォルトの名無しさん
20/01/24 07:10:40 O5UIpEDM.net
>>585
SQLってBNFで書けるから普通にswitchで書けると思うけど
615:デフォルトの名無しさん
20/01/24 07:19:43 3pA3r7pN.net
書ける書けないと
適する適さない
は別
616:585
20/01/24 07:49:27 1D9sTu/S.net
>>589
ツール使ってテーブルを生成させるならありだと思う。
そうでないなら、文法拡張のためにテーブルに手を入れるとか考えるだけでも嫌にならない?
あと、メンテナ交代のためにつくるドキュメントとかも。
>>598
それな
617:デフォルトの名無しさん
20/01/24 10:04:25 M35o3kEk.net
コンパイル時生成では普通。
618:デフォルトの名無しさん
20/01/24 12:24:16 O5UIpEDM.net
>>598
いや、わざわざgotoなんて使う必要ないって話な
C言語の時はエラー処理でgoto使う機会もあったけどC++なら例外で対処できるし
パーサーとか書いたことないとわからんかも知れんが
619:デフォルトの名無しさん
20/01/24 12:25:13 O5UIpEDM.net
>>599
ツール使うならコードまで生成させるだろ
620:デフォルトの名無しさん
20/01/24 12:33:56 pOzkcTtY.net
breakやらgotoやら、普通に関数作ってreturnすらば済む話なのになんでここまで盛り上がるかねぇ
621:デフォルトの名無しさん
20/01/24 12:38:12 nymKNYgW.net
>>601
わざわざgotoってのが意味不明
使用リソースや所要時間は非常に少ない
ただのジャンプ命令だから
少なくとも
わざわざ関数に分けるとか
わざわざ変数を使うとか
に比べればはるかに軽い
breakに比べれば
記述量が多いので
「わざわざ」という表現を使うことはあるだろう
622:デフォルトの名無しさん
20/01/24 12:42:44 pOzkcTtY.net
>>604
そんなエラーをgoto文で書いてる様なc++ソース読むのやだわw
623:デフォルトの名無しさん
20/01/24 12:47:41 nymKNYgW.net
無能自慢か
624:デフォルトの名無しさん
20/01/24 12:48:34 j8mERSyw.net
throwと同様の構文でgotoと同じコード生成する機能があれば良いのに
625:デフォルトの名無しさん
20/01/24 13:03:30 O5UIpEDM.net
>>604
タイプ量が少ないソースがいいソースとか思ってそうw
いつの時代の人なんだよ
626:デフォルトの名無しさん
20/01/24 13:43:32.45 Jh2W8wsF.net
わざわざ例外使わんでもgotoで十分なときも普通にある
gotoだから絶対ダメとか思ってそう
頭かたすぎ
627:デフォルトの名無しさん
20/01/24 13:59:14 M35o3kEk.net
法律で禁止するべきだな。
628:デフォルトの名無しさん
20/01/24 14:45:38 xfkHfIRp.net
>>603
ループの途中での return か?
629:デフォルトの名無しさん
20/01/24 16:31:56.03 NCsnJFfw.net
>>609
逆にわざわざgoto使う例外って何よ?
そんな個別情報も渡せない上にわざわざラベル名前まで考えて、goto文使う方がめんどくさいだろ
あーあれか、throwよりgotoの方が打つ文字少ないから楽とかかw
630:デフォルトの名無しさん
20/01/24 16:34:37.54 xfkHfIRp.net
throw って、入れる catch を RTTI を使って探すという
結構なコストのかかることをするが goto や longjmp にはそれがない
631:デフォルトの名無しさん
20/01/24 16:36:03.61 M35o3kEk.net
情報処理の教育を受けていると、大抵のものはステートマシンに見えるので、goto使いたくなるのかもしれない。
教育の有無で思考過程が違うので、使い道が理解できない人は使うことを禁じたほうが良い。
セキュリティにもかかわるので公安委員会直轄でgoto免許試験場を創設するべき。
632:デフォルトの名無しさん
20/01/24 16:58:54 Jh2W8wsF.net
>>612
情弱かよw
「c++ goto 例外」でググれば検索結果の最初のほうだけでもこんなに出てくる
URLリンク(tomeapp.jp)
URLリンク(www.thinkridge.com)
URLリンク(marycore.jp)
URLリンク(qiita.com)
URLリンク(www.nurs.or.jp)
633:デフォルトの名無しさん
20/01/24 17:00:51 M35o3kEk.net
>>615
一番上のリンクだけ見ましたが、これはミスリードじゃないだろか。
634:デフォルトの名無しさん
20/01/24 17:06:28 M35o3kEk.net
>>616
二番目のリンクも見ましたが、これはgoto代わりに例外を使うべきではないというお話ですよね。
例外の代わりにgoto使えという話ではないと思うんですよ。
「あれ?ifの代わりに例外使えるんじゃね?」とはならない。
同様に「あれ?gotoの代わりに例外使えるんじゃね?」ともなりません。