C++相談室 part136

次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512

C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part135
https://mevius.5ch.net/test/read.cgi/tech/1522495206/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.102【環境依存OK】
http://mevius.5ch.net/test/read.cgi/tech/1509780815/

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

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

----- テンプレ ここまで -----
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured

270 ◆QZaw55cn4c (ワッチョイ 2260-m0US)2018/06/17(日) 18:17:30.15ID:mtjEdwIk0
>>261
>iostreamはios系の様々なフラグがある
そうそう、今いち、よく定義がわからないんだよね
それに、手元の実装がこのフラグについてまともじゃないかもしれない

271デフォルトの名無しさん (ワッチョイ 6e02-Bw3Y)2018/06/17(日) 18:30:46.42ID:IIkN4spK0
iostreamを今、作り直すとしたらfilesystemやstring_viewも視野に入れなきゃね

272デフォルトの名無しさん (ワッチョイ edb6-5g47)2018/06/17(日) 18:54:25.32ID:ipfkqsZ+0
ビジネスで優秀な人材育成する上司は何を教えているのか?
https://www.youtube.com/watch?v=apxtSqxjw08&t=13s
美容師の楽しさ再発見!やる気スイッチが入る働き方セミナー
https://www.youtube.com/watch?v=DGzXQT799oY
マクドナルド伝説の店長が教える、最強店長になるために必要なこと
https://www.youtube.com/watch?v=0wMbR7JIeeQ&t=3154s
『上司が伝えるべき 一番大切なこと』
https://www.youtube.com/watch?v=xsfJ-ZC42pQ&t=1199s

273デフォルトの名無しさん (ワッチョイ 45d2-Bw3Y)2018/06/17(日) 19:38:39.93ID:GftzeAnS0
C++でよく使われる各オブジェクトのスタックサイズは以下の通り。
stringstreamとfstreamのサイズは無視できない大きさであることがわかるだろう。

・GCC - ubuntu Linux x64
 (sizeof(std::stringstream), sizeof(std::fstream), sizeof(std::ostream), sizeof(std::string), sizeof(std::vector<std::string>), sizeof(FILE))=(392, 528, 272, 32, 24, 216)

・Visual Studio 2017 - Windows10 x64
 (sizeof(std::stringstream), sizeof(std::fstream), sizeof(std::ostream), sizeof(std::string), sizeof(std::vector<std::string>), sizeof(FILE))=(248, 280, 112, 32, 24, 8)

274デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/17(日) 19:51:08.65ID:JVUiE6fQ0
>>273
数百バイト程度は許容できるんじゃないの。
コンテナに入れるわけでもないし。

275デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/17(日) 19:53:22.73ID:JVUiE6fQ0
>>268
ないよ。

276デフォルトの名無しさん2018/06/17(日) 19:54:46.50
直近のスレを見れば分かるとおり、C++は複雑怪奇魑魅魍魎だから
プログラミング初学者が手を出したらヤケドしかしない

277デフォルトの名無しさん (ワッチョイ 45d2-Bw3Y)2018/06/17(日) 20:02:30.99ID:GftzeAnS0
勉強でヤケドする分には問題ないし、
むしろ沢山ヤケドして危険を避ける能力を身に着けるしかない。
実務でやったらアウトだが。

278デフォルトの名無しさん (ワッチョイ 469f-cPc7)2018/06/17(日) 20:41:28.94ID:dJUJdMR30
iostream 文句言われてるけど、atomic に動作するところは thread 並列環境では
そこそこ良いのでは?もちろんその分遅さが気になる場面もあるけど。

279デフォルトの名無しさん (ワッチョイ 6e02-Bw3Y)2018/06/17(日) 21:07:46.84ID:IIkN4spK0
iostreamは速度を全く期待せずに使うという
C++らしからぬ面を持ったものだ
sync_with_stdio? はははは

280デフォルトの名無しさん (ブーイモ MM62-Z/ei)2018/06/17(日) 21:11:08.16ID:kJQS2F0bM
国際化に向かないのが致命的。
これだけで捨てる理由としては十分と思う。

281放置された蟻人間 ◆T6xkBnTXz7B0 (スフッ Sd62-+ixL)2018/06/17(日) 21:48:20.12ID:ETBxv0Nyd
MSVCのstd::arrayがC++11に準拠してくれればいいのに。使えねー。
言語レベルで区間チェックしてくれたら、データ破壊の場所がすぐにわかるのに。

282デフォルトの名無しさん (ブーイモ MM62-hu3a)2018/06/17(日) 21:52:06.00ID:PyYPwpSkM
スタティックライブラリAが別のスタティックライブラリBのAPIを使っている場合、ライブラリAにライブラリBをリンク、ビルドして、結果できたライブラリAだけをリンクして、実行ファイルを作る形式が良いでしょうか。
それともラリブラリA、ライブラリBを別々にリンク、ビルドして実行ファイルを作る形式が良いでしょうか。

283 ◆QZaw55cn4c (ワッチョイ 2260-m0US)2018/06/17(日) 21:54:39.50ID:mtjEdwIk0
>>282
>ライブラリAにライブラリBをリンク、ビルドして、結果できたライブラリ
そんなことができるのでしょうか?

284デフォルトの名無しさん (ワッチョイ 469b-OQnn)2018/06/17(日) 21:55:46.98ID:MR0PdhT00
後者しかできないような気がするんだけど

285デフォルトの名無しさん (ブーイモ MM62-Z/ei)2018/06/17(日) 21:57:07.16ID:kJQS2F0bM
>>281
msvcのat()関数は範囲チェックしないの?

>>285
するけど、多数に生配列があって困難

287はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 066f-Bw3Y)2018/06/18(月) 00:02:38.25ID:CYJOSJS20
iostream の替わりになるようなデファクトスタンダードが登場していない以上、
ほどほどに付き合っていくしか仕方がないよ。

C スタイルは普段から使うには抽象度が低くて面倒くさい。
printf は std::string を表示するのにさえいちいち c_str を通さなきゃならんのだからな。
書式指定との整合が型システムで保証されないのも古い設計だし。
処理系の方である程度は特別扱いすることで折り合いがついてるけど、
あらためて考えるとだいぶん不格好だと思う。

コンセプトやら何やらが導入されたらもうちょっとマシな入出力ライブラリが出来たりしないもんかね?
提案くらいは出てたりしない? って思ったけど、こないだ江添っちがTwitterで「無い」って言ってた気がする。

現実的にはxmlなど標準的な形式のファイルを扱うライブラリを使うんで本当に低レベルなIOはどっちでもいい

289273 (ワッチョイ 45d2-Bw3Y)2018/06/18(月) 06:12:18.90ID:q6319o4n0
>>274
iostreamは肝心な時に使えない橙武者です。

ログ出力するクラスは歌舞伎の黒衣のような慎ましい存在でなければならないのですが、
iostreamはあたかも歌舞伎の花形役者のようなオレ様的存在感を出すので好ましくありません。

実例をあげるならば障害発生した時に、ログ用途でiostream系を使うことがあり得えます。
cout やその他インスタンスが生成されてスタックを多く使うことになります。
つまり、実運用環境とログ埋込環境でメモリ構成が大きく異なる環境になってしまうことが避けられません。
iostreamはマルチスレッド環境など対話デバッグでは追跡しにくい現象をログ出力するのに適さない、と断言できます。

橙武者、黒衣など語の意味が分からない方は、ご自身でおググり下さい。

290デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/18(月) 08:25:55.66ID:Tb7Gp3zL0
io_contextで世界が変わる。

291デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/18(月) 08:29:09.26ID:Tb7Gp3zL0
coutってアクセスするたびに生成するわけじゃないよね?

292デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/18(月) 08:34:19.02ID:Tb7Gp3zL0
ツリートラバースするのに、再帰使うよりstd::deque使ったスタックのほうが速いな。

293デフォルトの名無しさん (ブーイモ MMb6-pMQN)2018/06/18(月) 08:36:26.28ID:h2dlgwUxM
>>291
グローバルオブジェクトとしてずっと存在してる

294デフォルトの名無しさん (ワッチョイ ed83-m0US)2018/06/18(月) 08:54:52.73ID:trIDsSoy0
内緒ですけどね。書式設定はprintfのほうがソースが見やすいですよ。

295デフォルトの名無しさん (ワッチョイ 8281-Bw3Y)2018/06/18(月) 10:18:21.92ID:wfZWFdrV0
内緒な、約束だぞ

296デフォルトの名無しさん (ワッチョイ 45d2-Bw3Y)2018/06/18(月) 11:02:34.48ID:q6319o4n0
「標準出力への書き込みは遅いから」との理由で、メモリ上にログをため込むことは多いかと思います。
iostream系だと stringstreamを使うことになりますがスタックサイズが割と大きくインスタンス生成のたびに時間もかかります。

さらにいえば、MSVCの場合、snprintf()に比べてstringstreamは書き込みに3倍弱時間がかかります。
本来ならば << 演算子はコンパイル時に型が決まるので書き込みが高速なはずなのですが、
MSVCだとstringstreamがsnprintf()に負ける有様ということです。
なお、Linux GCCの場合、snprintf()とstringstreamは書き込み速度の差は少ないようです。

297デフォルトの名無しさん (スップ Sd62-EDgZ)2018/06/18(月) 15:29:29.80ID:jTAI4T/jd
C++を完全に理解したんだけど、質問ある?

298デフォルトの名無しさん (スップ Sdc2-Gye4)2018/06/18(月) 16:23:01.82ID:sXmIUJTyd
CとC++で演算子の優先順位が異なる所があります
どこてしょう
もちろん両方に存在するものです

299デフォルトの名無しさん (ワッチョイ 4193-a7dz)2018/06/18(月) 17:54:25.08ID:JbXTSK+P0
>>298 の問題は面白いし俺も答えに興味あるけど >>297 への挑戦とすれば
「C++は完全に理解したけどCの方は知らないよ」で逃げられるかと。

300デフォルトの名無しさん (ワッチョイ ddc3-hrcC)2018/06/18(月) 18:01:10.79ID:b7nHR37f0
C++の規格はCの規格を参照してるし、Cとの差異も規格の一部になってるので
C++の完全な理解の中に当然含まれる

301デフォルトの名無しさん (ワッチョイ 4223-PZZX)2018/06/18(月) 18:31:36.77ID:xdRdwSco0
アホなので優先順位の違いはわからないけど、
if ((v=f()) == 0) を if ((v=f()) = 0) とタイポしたとき
c++ だとエラーにならず v が 0 になるのは嫌な感じ

302デフォルトの名無しさん (ワッチョイ c212-bAWz)2018/06/18(月) 21:04:40.33ID:0cjK0izC0
if ( 0.equals(v=f()) )

こう書ければいい

303デフォルトの名無しさん (ワッチョイ c27c-TqnL)2018/06/18(月) 21:06:09.32ID:wRZSUlvR0
Cでは代入式はその結果値が左辺値にはならないから v = 1 = 2 みたいな表現は通らない
C++では左辺値になるので通る

304デフォルトの名無しさん (ワッチョイ 469b-OQnn)2018/06/18(月) 21:21:29.41ID:Y3dlvOm10
昔定数を先に書くことで防げるって聞いたことがあるが
0=(v=f())

305デフォルトの名無しさん (ワッチョイ 4223-PZZX)2018/06/18(月) 21:25:53.85ID:xdRdwSco0
昔からこういう==での判定は
if (S_OK == (result = someApi()) {...}
と定数左で書けという作法もあるけど、
流行らないのは見た目が実行順と逆みたいで妙だからかねえ

〇〇=0 はあるけど 0=〇〇 は違和感しかないからなぁ
バッドノウハウの筆頭だと思う

307デフォルトの名無しさん (スップ Sdc2-PZZX)2018/06/18(月) 22:33:03.40ID:ejyTxCd5d
数学でも 0 = x^2 + 3x - 2 とかあまり書かないな

308デフォルトの名無しさん (ワッチョイ 469f-cPc7)2018/06/18(月) 23:04:23.94ID:wJzzPYpc0
まあそんなクソな書き方するくらいならテストコード書けやって話にはなるわな。

309デフォルトの名無しさん (ワッチョイ 929e-PCgz)2018/06/19(火) 00:49:41.47ID:kQ8CSRFN0
>>304-305
それいつの話だ馬鹿野郎
俺が新兵の頃には、そんなコード書いたら教官からブン殴られてたぞ!!

310デフォルトの名無しさん (ワッチョイ ad2d-QRh3)2018/06/19(火) 00:56:21.64ID:jJOU+tvI0
バッドノウハウ……かなぁ…?
定数を左に書く利点は テストより手軽にコンパイルエラーで止められる事だから
個人的には採用してるんだけど

int i = 0;

/* 想定した挙動 */
if ((i = 0) == 0) { printf("%i\n", i); } /* 定数 右: 出力 "0" */
if (0 == (i = 0)) { printf("%i\n", i); } /* 定数 左: 出力 "0" */

/* typo! == -> = */
if ((i = 0) = 0) { printf("%i\n", i); } /* !!! printfが実行されない! (Cでは通らない) */
if (0 = (i = 0)) { printf("%i\n", i); } /* コンパイルが通ら*ない* 助かった! */

/* () 忘れ */
if ( i = 0 == 0) { printf("%i\n", i); } /* !!! 出力 "1" (== (0 == 0) == true) 想定外! */
if (0 == i = 0 ) { printf("%i\n", i); } /* コンパイルが通ら*ない* 助かった! */

そもそも1文字の打ち間違いなんて テストコードの記述そのものでもやりかねないし
(「絶対に間違えない!」なんていう人がいたらコードどころか作文も書いたことない奴ですぜ)

まあ使用が推奨/禁止されてるかはチームに従うとして
ぱっと見で意図が解るようにはしておくとよいかと

311デフォルトの名無しさん (ワッチョイ 929e-PCgz)2018/06/19(火) 01:23:19.66ID:kQ8CSRFN0
>>310
そういうのはもはや統合開発環境の仕事なのだよ。

ていうか if の中で代入を書くとか真正のキチガイ。
有 り 得 な い

312303 (ワッチョイ c27c-TqnL)2018/06/19(火) 01:34:04.88ID:6qgw6hGx0
すまんかった >>303 は "v = 1 = 2 みたいな" ではなくて "(v = 1) = 2 みたいな"
括弧忘れたら結合順が変わってしまう 訂正

313デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/19(火) 03:10:51.39ID:WKXXm+ar0
統合開発環境ってEmacsのことだっけ。

314デフォルトの名無しさん (ワッチョイ ed83-m0US)2018/06/19(火) 05:39:20.97ID:1GZ30pc10
EmacsのせいでUNIXはDOSに負けたんだっけ。

315デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/19(火) 05:50:29.80ID:WKXXm+ar0
単体テスト書くと処理時間出るから、何に時間かかってるのかわかっていいよね。

316デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/19(火) 05:52:35.58ID:WKXXm+ar0
やはり一番時間がかかるのはIOだから、IO少なくするのが一番よさそう。
std::vectorなんか全体コピーしても余裕の速さだから気にする必要なかったんや。

317デフォルトの名無しさん (ワッチョイ ed83-m0US)2018/06/19(火) 06:19:41.06ID:1GZ30pc10
楽な仕事で羨ましい限りです。

318デフォルトの名無しさん (ワッチョイ 6e5b-Bw3Y)2018/06/19(火) 06:25:19.55ID:QGodAC8c0
IゾーンとOゾーンに時間をかけるのは楽しいじゃん

>>310
まさか真顔で言ってないよね?

320デフォルトの名無しさん (ワッチョイ ed83-m0US)2018/06/19(火) 09:20:33.15ID:1GZ30pc10
>>319
まじかよ。おまえ真顔じゃないか。

新着レスの表示
レスを投稿する