X



C++相談室 part147
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
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ほどしか増えない

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

↑え?だってお前、普通ダイナミックリンクするだろ?
"ダイナミックリンク"す・れ・ば、ファイルサイズ**増えないです**
0663デフォルトの名無しさん
垢版 |
2020/01/25(土) 13:54:31.32ID:cxLY0DeL
宣伝乙。
NHKが来たぞーにげろー。
0664デフォルトの名無しさん
垢版 |
2020/01/25(土) 13:55:49.58ID:FepESkjd
江添亮の本でstd::cout<<""にs付けろって書いてたんだけどsつけたらエラーになる
0665デフォルトの名無しさん
垢版 |
2020/01/25(土) 13:59:45.43ID:HbHTz3pb
>>657
久しぶりに笑う健康法ができてありがたかったんだよ

おーい芸人さんたち、アンコール! アンコール!
0667デフォルトの名無しさん
垢版 |
2020/01/25(土) 14:25:20.83ID:cxLY0DeL
とまあこのように、江添先生の本は、すべて理解してる人にしか理解できません。
0668デフォルトの名無しさん
垢版 |
2020/01/25(土) 14:32:55.37ID:HbHTz3pb
幼稚園児が大学の図書館へ行っても読める本ないのと同じだな
無理しないで「ぐりとぐら」くらいから始めとけ
0669デフォルトの名無しさん
垢版 |
2020/01/25(土) 14:53:05.04ID:cxLY0DeL
はい、江添釣れたー。
0671デフォルトの名無しさん
垢版 |
2020/01/25(土) 15:45:58.72ID:136JVXqR
>>666
そんなこと書いてなかった
0672はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/01/25(土) 15:52:56.31ID:NV/40SqZ
普通の文字列リテラルが char 型の配列であるというのは (初心者には) 分かり難いので、
いっそ一貫して std::string 型で扱うというのは悪くない方針だと思う。

だけどユーザー定義リテラルという枠組みもそれはそれでだいぶんアレな仕様なんで、どちらにしてもクソだよな。
0673デフォルトの名無しさん
垢版 |
2020/01/25(土) 16:06:56.27ID:bbXnDJeu
こんばんは、後藤です。
ところで ""s だけでは片手落ちな気がする
ちゃんと u""s みたいに文字コード指定しなかったら
string_literalsを使う意味ないような気がするんだけど
わしだけか
0676デフォルトの名無しさん
垢版 |
2020/01/25(土) 16:30:12.05ID:HjVTkheD
江添本は初心者向けと謳っていながらこのくらいわからん奴は帰れみたいな意思を感じる
0677デフォルトの名無しさん
垢版 |
2020/01/25(土) 16:50:56.75ID:lY+ErK7r
初心者に内容を理解してほしいんじゃなくて俺すげーってことだけ理解しろってスタンスだからな。
むしろ理解されると大したことやってないのがバレると思ってるくらいだろ。
0678デフォルトの名無しさん
垢版 |
2020/01/25(土) 16:53:23.32ID:XvrYCXmQ
C++はしたことがないが数学博士号のやつと高校卒業を一緒くたにするのが問題だろう
それぞれの学力で開始すべき章を設定するべきだ
できないとしたら著者の無能なので落胆することはない
0679デフォルトの名無しさん
垢版 |
2020/01/25(土) 16:58:57.12ID:cxLY0DeL
初心者がC++に入り込まないよう防御壁として江添先生が存在するのではないか。
0680デフォルトの名無しさん
垢版 |
2020/01/25(土) 17:03:37.43ID:cxLY0DeL
C++の道を行きたいなら、俺を倒してから行け。
ってことでは。
0682デフォルトの名無しさん
垢版 |
2020/01/25(土) 17:27:59.47ID:cxLY0DeL
C++の前に立ちはだかる屈強な門番。
俺を倒せるものでなければ入門を認めぬ。
0683はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/01/25(土) 18:19:41.41ID:NV/40SqZ
グダグダな C++ をグダグダじゃなく説明するのは無理だろ。
どの本を見たって少なからずグダグダか物足りないかどっちか。
0684デフォルトの名無しさん
垢版 |
2020/01/25(土) 18:23:50.63ID:qDxhJtbw
まぁ、実際の現場だと、c++なんてちょっと便利なC言語としてしか使われてないよ
未だにcharポインタやmalloc乱立してるし参照型すら使われてない。
クラスなんて関数まとめるnamespace代わりだし
0685はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/01/25(土) 18:25:32.23ID:NV/40SqZ
ひと昔前にstaticおじさんの話がバズったことあるけど、
たぶん現実にはけっこういるんだろうな。
0687デフォルトの名無しさん
垢版 |
2020/01/25(土) 18:32:00.68ID:4TCxFoUN
ちゅうか、C++ 使うなら charポインタは必須だ。
使いたくないなら 別の言語を使ったほうがいい。
0688デフォルトの名無しさん
垢版 |
2020/01/25(土) 18:43:08.64ID:HjVTkheD
Cのライブラリを使わない限り文字情報はすべてstringで済む
モダンC++の仕様はそういう範囲内での使用も許容している
0690デフォルトの名無しさん
垢版 |
2020/01/25(土) 18:51:29.47ID:t8q8NVJB
>>684
>クラスなんて関数まとめるnamespace代わりだし
さすがにそれはダメだと思うが・・
そういう現場確かにあるが

>>688
とか言いながらstringは途中からnull終端を保証したりして、
結局Cの資産を無視できなかったという
0691デフォルトの名無しさん
垢版 |
2020/01/25(土) 18:53:42.93ID:mY899MyV
もともとc_strはnull終端されてた
それに合法的にnull文字を含むことが出来る時点でnull終端ではない
0693◆QZaw55cn4c
垢版 |
2020/01/25(土) 20:55:09.57ID:0oKBD7Vk
>>684
私のことですね…
new をグローバルオーバーロードしたら、その中では malloc() するしかないですからね…
0694デフォルトの名無しさん
垢版 |
2020/01/25(土) 21:03:28.44ID:gDStPvND
>>693
> >>684
> 私のことですね…
> new をグローバルオーバーロードしたら、その中では malloc() するしかないですからね…

するしかない?
mallocはどうやって実装されてると思う?
0695デフォルトの名無しさん
垢版 |
2020/01/25(土) 21:16:51.56ID:HbHTz3pb
>>693
おまえさ、何のために new をグローバルオーバーロードしてるの?
malloc でいいんなら、そんな必要ねえだろ

おまえアホか
0696デフォルトの名無しさん
垢版 |
2020/01/25(土) 21:25:16.13ID:gDStPvND
まぁデバッグの手法としてなくはない
ただその手のものは既存のものが腐るほどあるからそれ使った方がいい
0697◆QZaw55cn4c
垢版 |
2020/01/25(土) 22:50:36.48ID:0oKBD7Vk
>>694
>するしかない?
ええ、するしかないと思いますよ

>>695
>何のために new をグローバルオーバーロードしてるの?
無論 delete と対になっているかどうかをチェックするためですよ、こういうのは自分では出来ていると思っていても時々お漏らししてしまいますからね
まあ、C++11 以降は手抜きして make_shared することを覚えてしまってずいぶんと時間が経ちましたが、それでも生ポを使うときは new/delete をオーバーロードしますね
https://mevius.5ch.net/test/read.cgi/tech/1434079972/51 line.143〜150
0698◆QZaw55cn4c
垢版 |
2020/01/25(土) 22:53:24.31ID:0oKBD7Vk
>>696
昔の borland c++ にはまさしくそのための、なんていうんだったんでしたっけ、そういうコンパイルスイッチがあって便利に使っていましたが、
今評価版を入手すると、それは clang ベースに変更されて、その機能がなくなってしまったんですよね…
0699◆QZaw55cn4c
垢版 |
2020/01/25(土) 23:01:38.28ID:0oKBD7Vk
>>698
思い出した、bcc32 CodeGuard でしたっけ
0700デフォルトの名無しさん
垢版 |
2020/01/25(土) 23:17:56.01ID:gDStPvND
>>697
それなりにプログラマ経験あるんだと思ってたけどmallocの中身知らないとはね
別にメモリ確保のsyscall直接使ってもいいんだぞ
むしろnewをリプレースしたい場合ってページ単位で処理したいときとかでしょ

ちなみにこれはデバッグで使うのも有用だぞ
unmapしてるところにアクセスしたらその時点で例外で止まるから原因特定が容易
まぁそんなの自前でやる前にValgrindでも使えって話だけど
0701はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/01/25(土) 23:24:58.70ID:NV/40SqZ
>>697
アプリケーションの層ではアロケータを書く機会はまずないから
やったことないのは別にいいけど、
さすがに new の本質はメモリの割り当てだってのはわかってて欲しいわ。
0702◆QZaw55cn4c
垢版 |
2020/01/25(土) 23:28:27.92ID:0oKBD7Vk
>>700
>それなりにプログラマ経験あるんだと思ってたけどmallocの中身知らないとはね
専ら win32api でやっているので、::HeapAlloc(::GetProcessHeap(), ...) とか ::HeapFree(::GetProcessHeap(), ...) だとは考えていましたし、数年前はそう置き換えていたこともありました。

>unmapしてるところにアクセスしたらその時点で例外で止まるから原因特定が容易
これは初耳です。よろしければ、もう少しキーワードだけでいいので羅列していただけませんか
0703◆QZaw55cn4c
垢版 |
2020/01/25(土) 23:33:20.09ID:0oKBD7Vk
>>701
それはおそらく大丈夫だと思います
0704デフォルトの名無しさん
垢版 |
2020/01/25(土) 23:36:38.54ID:nqs2x9Ls
関数で切り出すのは入出力がはっきりするというメリットはあるが
ループの内と外の依存性が高い場合に内を無理矢理関数分けすると
シグネチャに入力引数と出力引数(参照渡し)がぞろぞろ並ぶことになって
それはそれでお勧めしない
(関数の意味も不明確になりがちやし…
0705デフォルトの名無しさん
垢版 |
2020/01/25(土) 23:52:12.30ID:gDStPvND
>>702
そうだよwindowsならそのあたりだよ
あとVirtualAllocね

> >unmapしてるところにアクセスしたらその時点で例外で止まるから原因特定が容易
> これは初耳です。よろしければ、もう少しキーワードだけでいいので羅列していただけませんか

new/deleteのたびにページ単位で確保・解放するんだよ
それこそVirtualAllocで
だから重いよ
そうするとdangling pointerでヒープ壊される問題があった場合、
壊しにいったら即セグフォルで止まるからデバッガつなげれば犯人特定できる
0706デフォルトの名無しさん
垢版 |
2020/01/26(日) 00:43:59.41ID:F5s0MU2W
>>686
そんな職場は大変だぞ
構造体だからって、triviallycopyableを満たさないクラスをわざわざvoidポインタに格納して、memcpyしたり
クラスをわざわざmallocしてコンストラクタ、デストラクタ飛ばしたり
const属性をキャストでわざわざ消して値変えられたり
0709デフォルトの名無しさん
垢版 |
2020/01/26(日) 01:44:39.85ID:hLglXOws
中途半端にc++を持ち込んで現場を荒らすやつもいるからね
>>706 の状況はそういうところで見たことある
別にc++が書けるのがえらいわけじゃない
質の良いプロダクトをきっちり仕上げられる奴がえらい
まわりがc++わからないメンバーならcで書くか、
c++が必要というなら十分にチームでトレーニング行ってからだ
0710はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/01/26(日) 01:48:04.74ID:zFvDGbzt
C から段階的に学んでいける (業務を止めずに) って D&E には書いてあるけど、
今の C++ じゃもう無理だと思うわ。
0715デフォルトの名無しさん
垢版 |
2020/01/26(日) 07:41:47.19ID:Yuet6lAk
>>683
禿4を少しは見習っていただきたい。
0716デフォルトの名無しさん
垢版 |
2020/01/26(日) 10:01:19.30ID:aNHbuwn9
>>706
それは問題。
でも、STLべったりのC++は Cとの書き方の乖離が激しすぎて、もはやCの冠を被ってほしくない。
0718デフォルトの名無しさん
垢版 |
2020/01/26(日) 10:47:19.67ID:VrR0aqw1
>>716
CはCらしく、C++はC++らしく使えばよろしい
CをPascalっぽく使うやつとかすげー迷惑なのと同じ
0720デフォルトの名無しさん
垢版 |
2020/01/26(日) 10:56:24.48ID:ZSyO84gV
テンプレートメタプログラミングはC++らしいとも思うけど全然別の言語になっている気がしないでもない
0721◆QZaw55cn4c
垢版 |
2020/01/26(日) 11:09:29.56ID:rQ+CcOdx
>>705
情報ありがとうございます
::VirtualAlloc() 系は書いてあることが難しい上に、ばっちゃの遺言「::HeapAlloc() を使え」もあって敬遠していましたが、ここで教えてもらったのもなにかの縁だからデバッグ用に試行してみようと思います

win32api の criticalsection と signal でやっていた(何かがまずくてstarvationに悩まされていました)のも
C++11 になって pthread が大幅に規格に取り込まれた以上、
C++11 の上からの mutex・cond 派に切り替えようか、とか、C++11 になってスタイル変更を考え中です
0724デフォルトの名無しさん
垢版 |
2020/01/26(日) 11:41:25.57ID:VrR0aqw1
確かに大変だね
if breakしてる複合文を関数にするときにreturnとか言い出すやつは
longjmpだろうがって
0725デフォルトの名無しさん
垢版 |
2020/01/26(日) 12:03:53.99ID:aNHbuwn9
>>720
実際、別言語だと思う。
C++はtemplateや演算子のオーバーライドを使えば、ほぼ別言語をみなせるようなものを上に載せられる設計になっているので。
STLを使いまくるプログラミングの書き方だと、もはやCとは何の関連性もなくなってしまっている。
0726デフォルトの名無しさん
垢版 |
2020/01/26(日) 12:09:22.76ID:BKKks8j/
>>723
ループ抜け出すぐらいでそんな苦労するようなコードになってるなら
関数で抜け出すのが当然だろカスが。
いくら脳みそ足らなくてもgoto擁護のために無理筋言ってるってことにそろそろ気づけ。
0728デフォルトの名無しさん
垢版 |
2020/01/26(日) 12:13:10.43ID:Yuet6lAk
ネストするなら別のプログラムに切り分けましょう。
シェルから呼び出せばいいのです。
0730デフォルトの名無しさん
垢版 |
2020/01/26(日) 12:39:03.45ID:aRFw4TjA
>>727
「gotoダメ!絶対!教」の戒律を破ることじゃないかな。きっと身を裂かれるほどの苦しみなんだろうw
0731デフォルトの名無しさん
垢版 |
2020/01/26(日) 12:50:28.18ID:PjjUDKm0
いったん収まったと思ったら
また goto の話開始してて草
アスペ特融の拘りと言われても仕方がないな
0732デフォルトの名無しさん
垢版 |
2020/01/26(日) 13:01:54.18ID:Yuet6lAk
goto以外の話題を提供できないお前が悪い。
0734デフォルトの名無しさん
垢版 |
2020/01/26(日) 17:07:41.56ID:aNHbuwn9
>>729
たしかにCもマクロを使えば結構何でも出来る。
だが、マクロを多用すると分かりにくくなるとも言われていたし、使い方によっては、ソースコードが全く別言語のようになってしまうことも知られていた。
それと同様の現象がSTLにおいては起きる事態になってしまっている。
0736デフォルトの名無しさん
垢版 |
2020/01/26(日) 17:19:16.84ID:VrR0aqw1
>>734
なってねえよ
おまえさんにはSTLがIOCCCに見えるのか

慣れの問題と言いたいがおまえさんは極端すぎ
一種の病気だ
0737デフォルトの名無しさん
垢版 |
2020/01/26(日) 17:21:00.68ID:aNHbuwn9
>>736
STLの作者は、自分では分かり易くしようとしているようでいて実際には逆に分かりにくくしてしまっている。
0738デフォルトの名無しさん
垢版 |
2020/01/26(日) 17:22:57.37ID:Yuet6lAk
STLは神がかってるけどな。
あの時代によく設計できたな。
0742デフォルトの名無しさん
垢版 |
2020/01/26(日) 17:42:50.97ID:VrR0aqw1
>>738
だよな

Cではmemsetやqsortにvoid*というリスキーなことをせざるを得なかったのを
関数テンプレートで型情報をきちんと面倒見るようにできたし
リニアサーチがない等のCライブラリの不備も解消した

そこに気付かないやつはプログラマとしての資質を問われる
0743デフォルトの名無しさん
垢版 |
2020/01/26(日) 17:50:07.66ID:loc7kxiY
>>738, >>742
あのな、STLは設計構想から含めると十年から数十年かかってんだよ
それだけよく考え抜かれたものが優れてないわけがない
これ何回も書いたんだけどな

「最新仕様追ってる俺スゲー」したいだけの奴の希望的観測はもうこりごりだわ
0744デフォルトの名無しさん
垢版 |
2020/01/26(日) 17:53:28.80ID:loc7kxiY
最新仕様とか書いたらSTLが最新?とか言われそうなんで先に言っとくけど
マクロ(プリプロセス時メタプログラミング)を貶してテンプレートは持て囃すのはダブスタってことなんで誤解なきよう
0745デフォルトの名無しさん
垢版 |
2020/01/26(日) 17:53:53.15ID:Yuet6lAk
ただ俺としては右辺値参照の発見にノーベル賞を授与するべきだと思うんだよな。
これ人類史上でも大きな発見じゃないかと思うんだよな。
0748デフォルトの名無しさん
垢版 |
2020/01/26(日) 18:01:03.32ID:VrR0aqw1
>>743
742だが、おまえさんは俺が何がわかっていないと言いたいんだ?
どっかの馬の骨が何回書いたかなんて興味ねえが
当たり前のことをドヤられる意味がわからんぞ
0749デフォルトの名無しさん
垢版 |
2020/01/26(日) 18:05:34.93ID:Yuet6lAk
STLにノーベル文学賞なんてオサレだと思わないか。
0750デフォルトの名無しさん
垢版 |
2020/01/26(日) 18:05:38.96ID:VrR0aqw1
>>746
同感

そもそも左辺値参照にconstをつけたら右辺値を指せるなんて
珍妙なルールが招いた禍根を何とかする苦肉の策が右辺値参照だかんな

今ふり返って見るとconstなしの左辺値参照でもテンポラリを束縛できて
それを禁止したい場合のキーワードがあればよかったんだと思う
0751はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/01/26(日) 18:23:11.21ID:zFvDGbzt
>>745
互換性を失わない形で性能にも寄与するのはすごい思い付きだと私も思った。
スマートポインタが充実する方向で良くなると思っていたので、
まさか参照を区別する形でコピーを避けるとは思いもよらなかった。

だけどなぁ……。 結局は後付けなんだよね。
互換性を捨てられないという制約の中ではこれ以上ない発明ではあっても、色々と不満はあるよ。
ムーブ自体は言語のコアに組み込まれた機能ではないから
ムーブ後の抜け殻をうっかりいじってもコンパイラは黙って通しちゃうし。

ムーブできるようにしようとすると実質としてはポインタの入れ替えになるから、
各クラス向けにカスタマイズしたスマートポインタを書いてるみたいなもんだ。
本来ならそんなのコンパイラの最適化で頑張ってなんとかすべきことだろ。
言語処理系の敗北の証にすら見える。

いや、良いとは思ってるんだよ。
間違いなく rvalue 参照は素晴らしい発明で、 C++ をより良くした。
でもまあいいことばかりでもないよねっていうちょっとした愚痴。
0753デフォルトの名無しさん
垢版 |
2020/01/26(日) 18:26:11.67ID:jQnb27FW
構造体/クラスを戻り値にするっていう発想が無かった時代からのつぎはぎ拡張だから
0754デフォルトの名無しさん
垢版 |
2020/01/26(日) 18:51:03.98ID:PjjUDKm0
そもそも構造体を=でコピー出来るのが始まりだからな
配列は=でコピーできないのにな
その辺一貫性なかった>C言語
0755はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/01/26(日) 19:06:02.54ID:zFvDGbzt
>>754
配列は (その先頭要素を指す) ポインタに型変換されるルールを入れてしまったので
それと辻褄の合う形には出来なかったんだと思う。
0756デフォルトの名無しさん
垢版 |
2020/01/26(日) 19:07:43.07ID:PjjUDKm0
もしCが
構造体を参照するとポインタ相当になります
引数で渡すときも&つけなくても勝手にポインタになります
コピーするときはmemcpyしてください
って仕様だったらC++はどうなってたんだろうな
色々まずいことになるのは確か
0757デフォルトの名無しさん
垢版 |
2020/01/26(日) 19:09:16.84ID:PjjUDKm0
↑ただ、モダンな言語はむしろそういう仕様なんだよな
その代わりGCがあるが

しかし、それはそれで不便なのであった
0758デフォルトの名無しさん
垢版 |
2020/01/26(日) 19:23:48.53ID:VrR0aqw1
>>744
おまえさんは
#define STR char* //と、
typedef char* STR; //の違いが
わかってなさそうに見えてしまうが
違うよな?

コンパイラでないものによる字面の読み替えと
コンパイラによる意味の読み替えを
区別するのはダブスタか?
0759デフォルトの名無しさん
垢版 |
2020/01/26(日) 19:38:43.16ID:loc7kxiY
>>758
そういうのじゃなくて、>>734に対して>>736書いたよな?
慣れ、ってのはわからんでもないがSTLの成功にはっちゃけて何でもテンプレートでどうにかする
今の風潮は俺もどうかと思うので。
もちろんマクロでメタプログラミングするよりは遥かに楽だけど、方向性としては同じようなもんだろ
0760デフォルトの名無しさん
垢版 |
2020/01/26(日) 19:41:08.78ID:loc7kxiY
というかVCだとプリプロセスだけ済ませたソース見れるから、
時にテンプレートよりデバッグ楽かもしれない
0761デフォルトの名無しさん
垢版 |
2020/01/26(日) 19:59:37.02ID:VrR0aqw1
>>759
質問に答えてないな
字面の読み替えは評判悪く
意味の読み替えが広く受け入れられているのは
ダブスタか?
■ このスレッドは過去ログ倉庫に格納されています

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