C++相談室 part148

レス数が950を超えています。1000を超えると書き込みができなくなります。
2020/01/31(金) 20:54:06.26ID:Nt0XFA2s
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part147
https://mevius.5ch.net/test/read.cgi/tech/1576659413/
このスレもよろしくね。
【初心者歓迎】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/ (日本語)
888デフォルトの名無しさん
垢版 |
2020/02/16(日) 08:25:44.50ID:Yy7z+EdH
具体的な数字が出てるとイメージが湧く。
889デフォルトの名無しさん
垢版 |
2020/02/16(日) 08:45:53.63ID:Yy7z+EdH
170クロックならあんまり気にする必要ないな。
2020/02/16(日) 10:26:07.87ID:w0IbR+6u
組み込みでc++がそもそもおかしい
2020/02/16(日) 11:00:34.43ID:1DEBeg9G
>>887
よっぽどでない限り、AAAゲームでも使われてるよ。
2020/02/16(日) 11:01:02.59ID:B02+i8yM
最近では小規模組み込みでもC++を使う事はあります

new / deleteやヒープを無効にしたり
newのみでdelete出来ないようにしたり
なんてこともあります
2020/02/16(日) 11:03:58.49ID:+vprjU7s
>>890
視野狭すぎ
2020/02/16(日) 11:12:03.97ID:w0IbR+6u
また馬鹿が無駄に一般化してできるワイ言ってんのか。。相変わらずだな。
2020/02/16(日) 11:20:41.43ID:+vprjU7s
日本語でおk
896デフォルトの名無しさん
垢版 |
2020/02/16(日) 11:23:16.68ID:Yy7z+EdH
ストリームってなんで遅いんだろね。
2020/02/16(日) 11:39:47.59ID:Rlzwkt+8
>>891
そりゃそういう例もあるわな
だから何?w
898デフォルトの名無しさん
垢版 |
2020/02/16(日) 11:42:38.67ID:Yy7z+EdH
スレで、do{}while()はダメっぽいこと書いてあったけど、なんでダメなの?
2020/02/16(日) 12:30:30.11ID:q7JzY0gs
>>887
でもお前は組み込みにもゲーム開発にも携わってないじゃん
2020/02/16(日) 12:42:15.06ID:Rlzwkt+8
>>899
ごめんねー、俺はプリンタ屋さんなのw
ゲームは知り合いの話ね
901デフォルトの名無しさん
垢版 |
2020/02/16(日) 12:54:36.44ID:Yy7z+EdH
プリンタ屋さんってどんな仕事ですか?
2020/02/16(日) 12:58:53.64ID:Rlzwkt+8
>>901
俺は制御周り、上位インターフェースからのデータを描画ルーチンにに渡したり、下位インターフェースにデータ渡したり、パネルとかの制御をやってる
描画部分はまた別の人がやってる
903デフォルトの名無しさん
垢版 |
2020/02/16(日) 12:59:56.11ID:Yy7z+EdH
なんか難しそうですね。
904デフォルトの名無しさん
垢版 |
2020/02/16(日) 13:01:18.53ID:Yy7z+EdH
プリンタってプロセッサはどんな感じのを使うんですか?
newってあるんですか?
905デフォルトの名無しさん
垢版 |
2020/02/16(日) 13:02:40.97ID:Yy7z+EdH
プリンタのヘッドについてる穴の数は決まっているんだから、あまりヒープが必要無さそうな気もする。
906デフォルトの名無しさん
垢版 |
2020/02/16(日) 13:03:59.79ID:Yy7z+EdH
std::vectorの上にヒープを作っても速度的に大丈夫なことは確認した。
2020/02/16(日) 13:07:31.29ID:Rlzwkt+8
昔はSHシリーズとかR2000とか
今はARMもそれなりに使ってる
制御だとnewは基本使わない
あと俺がやってるのは業務用のLBP
908デフォルトの名無しさん
垢版 |
2020/02/16(日) 13:08:47.09ID:Yy7z+EdH
ってことはキャノンですか。
909デフォルトの名無しさん
垢版 |
2020/02/16(日) 13:10:53.15ID:Yy7z+EdH
メモ問題は結局ホワイトボード買ってきた。
ホワイトボードをワンノートに撮影するという昔っぽいことに。
2020/02/16(日) 13:11:07.93ID:Rlzwkt+8
流石に社名までは出せんわw
911デフォルトの名無しさん
垢版 |
2020/02/16(日) 13:12:13.52ID:Yy7z+EdH
ワンノートのアンドロイド版はカメラにホワイトボードのモードがあるんだけど、テカリ消してくれないし、ホワイトバランスも調整してくれない。
2020/02/16(日) 13:12:31.37ID:VK9AAsv4
PostScript くらいならプリンタの側で処理することもあるし、
世間で想像されているよりは高級なことをやっているんじゃないかなぁという気もする。
913デフォルトの名無しさん
垢版 |
2020/02/16(日) 13:16:21.65ID:Yy7z+EdH
ってことは、別の人がnew使いまくりなのでは。
914デフォルトの名無しさん
垢版 |
2020/02/16(日) 13:17:17.71ID:Yy7z+EdH
テカテカしないホワイトボードないのかな。
2020/02/16(日) 13:20:18.57ID:VK9AAsv4
>>914
https://www.google.com/search?q=%E3%83%9B%E3%83%AF%E3%82%A4%E3%83%88%E3%83%9C%E3%83%BC%E3%83%89+%E3%83%9E%E3%83%83%E3%83%88%E3%82%BF%E3%82%A4%E3%83%97
916デフォルトの名無しさん
垢版 |
2020/02/16(日) 13:20:51.42ID:Yy7z+EdH
ありがとん。
917デフォルトの名無しさん
垢版 |
2020/02/16(日) 13:27:19.36ID:Yy7z+EdH
モーター動かしたりするのはnew使ったらダメなんだろな。
918デフォルトの名無しさん
垢版 |
2020/02/16(日) 13:52:37.96ID:Yy7z+EdH
リアルタイムOSはヒープあるんだろか。
2020/02/16(日) 14:03:56.47ID:1DEBeg9G
>>900
ゲームに関しては、かなりちゃんとした現場で昔から malloc は使われていたし、全社的に使っても問題ないとされていた。
2020/02/16(日) 14:33:04.16ID:Rlzwkt+8
>>919
で?
使われてる例も使われない例もあるよ
タイミングにシビアなゲームだと使い辛いと言うだけ
2020/02/16(日) 14:34:24.22ID:Rlzwkt+8
>>918
最大実行時間が読める専用のヒープを持ってたりするよ
922デフォルトの名無しさん
垢版 |
2020/02/16(日) 14:44:07.47ID:Yy7z+EdH
あるんだ。
2020/02/16(日) 14:49:10.64ID:B02+i8yM
>>918
ヒープを使うかどうか選べるものが多い
924デフォルトの名無しさん
垢版 |
2020/02/16(日) 14:53:55.58ID:Yy7z+EdH
選べるってことは、用途によって使い分けが必要って事なんだろな。
2020/02/16(日) 14:59:29.04ID:D2RmZx9z
ループ内で可変長のvector使っているようなのは、外に出してループ始めにclearする方がいい
ループごとにvector出力しなきゃいけない場合も、moveしないでcopyした方がいい
2020/02/16(日) 15:03:54.38ID:k775l7KG
>>920
意見されたら喧嘩売りたくなる病気なの?
2020/02/16(日) 15:10:11.48ID:D2RmZx9z
mallocは使い方が余程ひどく無ければ、性能上問題になることはない
問題になっている場合もプロファイラでその部分だけ対策すればどうにでもなる
断片化やmalloc自体の管理領域容量が気になるほどの環境では使わない方がいいが
2020/02/16(日) 15:11:53.22ID:+ZTPu1gL
>>926
それお前じゃね?
2020/02/16(日) 15:13:28.86ID:+ZTPu1gL
>>927
リアルタイム系の仕事したことないならそう言う考え方でもいいと思うよ
2020/02/16(日) 15:17:30.49ID:D2RmZx9z
そもそもリアルタイム系の処理で、実処理部分でmallocするってのは普通しないよね

初期化時に必要なバッファはあらかじめ確保しておくものでしょ
そこはmallocだろうが静的確保だろうが変わらないし
2020/02/16(日) 15:23:06.64ID:8bxeBykO
>>929はループの中で毎回malloc freeしてるからそりゃ性能が気になるよね
2020/02/16(日) 15:24:31.11ID:1DEBeg9G
>>925
std::vector<TYPE> は、リンクリストではなく、「可変長配列」なので、std::list<TYPE> に比べて、TYPE のコンストラクタがデコボコした頻度で
多めに呼び出されてしまう傾向がある。TYPEのコンストラクタの中で何かをnew していると、new が呼び出される回数をグラフにした場合、
デコボコになるため、速度的に滑らかさがなくなってしまう可能性が考えられる。
それは、newの速度がデコボコなのではなく、std::vector が持つ悪い性質の一つ。
速度的に「滑らか」にしたいならば、std::list の方が適している。
そもそも、C言語がポインタを用意したのは、リンクリストを使いたかったからで、Cはデータ集合用のデータ構造として動的リストではなくリンクリストを用いるのが伝統。
Cの高速性とはリンクリストによるものと言っても過言ではない。
newも、mallocもコンストラクタも、リンクリストと最も相性が良い傾向がある。
cppreferenceなどでも、std::vectorが出てくることが多いが、Cの新かを発揮するにはstd::listの方が良い。
2020/02/16(日) 15:25:54.32ID:1DEBeg9G
>>932
誤:Cはデータ集合用のデータ構造として動的リストではなくリンクリストを用いるのが伝統。
正:Cはデータ集合用のデータ構造として動的配列ではなくリンクリストを用いるのが伝統。
2020/02/16(日) 15:27:49.69ID:D2RmZx9z
いやいや、速度がシビアならreserveしとけと
cとの親和性考えなきゃdequeも良いが、cのAPI呼び出し考慮すると結局vectorをうまく使うのが一番良い
2020/02/16(日) 15:28:20.99ID:1DEBeg9G
>>929
std::vector<TYPE>を使っていて、TYPEのコンストラクタの中でnewするのはリアルタイム処理には向きません。
その場合、std::list<TYPE>に変えれば劇的に速度が安定するはずです。
2020/02/16(日) 15:30:12.10ID:1DEBeg9G
>>934
CのAPI呼び出しで集合を渡す場合、通常、集合の要素はコンストラクタを持ちません。
その場合は、std::vectorは適すでしょう。
ところが、要素がコンストラクタを持つ場合は、std::listが適します。
2020/02/16(日) 15:32:54.67ID:D2RmZx9z
vectorで再配置する際にmoveされない前提なのね
2020/02/16(日) 15:33:13.19ID:1DEBeg9G
>>936
補足すれば、APIは、リング0のシステムランドで実装されていることが多いため、
リンクリストの様な複雑な構造が用いられることが少ないのです。
しかし、それはAPIに限った話で、Cは誕生したときから、要素数が変化する
集合には、動的配列よりもリンクリストを用いるのが伝統でした。
伝統と言うよりも、リンクリストこそがCの核心・本質といっても過言では有りません。
2020/02/16(日) 15:35:27.77ID:1DEBeg9G
>>937
C言語とはリンクリストのことです。
動的配列は、Cの文化ではありません。
2020/02/16(日) 15:36:04.25ID:MPWqg8uW
アドレスで直にアクセスできる言語の強みはリンクリストで活きるからごもっとも
2020/02/16(日) 15:40:23.46ID:+ZTPu1gL
>>930
そう言う事
平均的には間に合っても確保や解放にかかる時間が読めなくなる
100万回に1回でもダメならダメっていう世界だしね

>>931とかはそう言うことがわかってないので頓珍漢なレスになってるw
2020/02/16(日) 15:40:27.92ID:pXV6w9YM
>>934
reserveしただけだとOSによっては実メモリ確保しなさそう…
で初回アクセスでおもむろにページが用意されれる
ヨカン
2020/02/16(日) 15:42:34.49ID:D2RmZx9z
それだとmalloc使うこと自体不味いだろ
確率でmmapしちゃうのだから
2020/02/16(日) 15:44:00.56ID:pXV6w9YM
別に
>>925の前半でおk
2020/02/16(日) 15:46:21.91ID:D2RmZx9z
もちろん初期化時以外でね
2020/02/16(日) 16:01:46.00ID:1DEBeg9G
>>937
moveを使いたい場合、要素の TYPE クラスに move 用の記述が必要となるため、手間がかかります。
947デフォルトの名無しさん
垢版 |
2020/02/16(日) 16:01:54.10ID:Yy7z+EdH
is_pod_vで事前条件を確認してるけど、PODはなくなるんだってね。
2020/02/16(日) 16:02:29.34ID:Rlzwkt+8
>>935
まあお前がそう思うならそうなんだろうな
お前ん中ではな…
2020/02/16(日) 16:07:00.64ID:D2RmZx9z
listで美味しいのはsplice使いたい時くらいだろ
multi threadのログ統合したい時とかに、lockに必要な時間を最小化出来る
2020/02/16(日) 16:26:27.54ID:c8Po0Swg
>>947
POD = trivialかつstandard_layout
だから後者を使うようにすればいい
2020/02/16(日) 17:05:35.53ID:+vprjU7s
子スレッドを休眠状態で作る方法ない?
起動直後にcondition_variable::waitとかじゃなく
初期状態として
2020/02/16(日) 17:13:29.37ID:YrNuZAe7
何のために?それによる
953デフォルトの名無しさん
垢版 |
2020/02/16(日) 18:53:05.64ID:Yy7z+EdH
>>950
ありがとん。
2020/02/16(日) 21:26:26.27ID:D0JJuQrX
>>953
いえいえ
2020/02/16(日) 23:16:48.80ID:B02+i8yM
>>924
まあそりゃね

使えるようにしてもPCやスマホのように自由には使えないぞ
こまめに確保解放なんてことはしない
基本最初に確保して終わり
解放はしない
だから確保しか出来ないヒープも選べる
2020/02/16(日) 23:20:30.34ID:B02+i8yM
>>927
それはPCやスマホなどリッチな環境の場合

>>931
一見軽そうで重い関数があったりするから
同じ人が同じ時に作ってたらそんな処理にはしないだろうけど
2020/02/17(月) 00:08:48.44ID:U44ZlMgK
白物家電のマイコンやら、pfcのマイコンやらもやったが、そんなのはそもそもmalloc使うような環境じゃなかったしなぁ
RAMもkB単位で少ないし、自由に関数呼べるほどスタックも無いし
割り込み部分はアセンブリで書いてた
2020/02/17(月) 00:14:53.75ID:/jKzm6f9
今は冷蔵庫や電子レンジもAI積んでネットワークに繋がるIoT時代だけど
それでも組み込みって未だにそんな感じなの?
2020/02/17(月) 00:16:48.70ID:U44ZlMgK
まあそれは特に東南アジア向けだったし
日本よりさらにチープだったのかも
2020/02/17(月) 00:19:59.06ID:uafn9Eqq
>>958
そんなのごく一部
2020/02/17(月) 00:20:59.44ID:uafn9Eqq
いまだにチープな8bit CPUもたくさん使われている
2020/02/17(月) 00:23:25.57ID:U44ZlMgK
cortex-m0とか載ってたらもう小躍りしちゃうくらいのリッチさだよね
2020/02/17(月) 00:34:16.83ID:H8nvOahp
リッチなCPUを使うって事は
それだけ求められる事が大きいわけで
2020/02/17(月) 07:41:59.44ID:xyBTOgD8
でもCPU節約するために人件費かけて結局商品高いじゃん
2020/02/17(月) 09:22:40.01ID:usLteeFN
趣味じゃないんだから
当然トータルで考えるよ

開発工数、単価、機能性能、信頼性、供給、大人の事情、...
2020/02/17(月) 10:36:24.72ID:sgjaAMaL
ゲーム業界の人だけど
new使っても問題ないってのはおれの常識とは異なる

まず問題が広すぎる
言いたいことはデフォルトのグローバルヒープを無邪気に使っていいか
ということだと仮定すると
AAAクラスでそんな杜撰なことしてるところはないと思う

組み込みもそうだがリアルタイム性が必要とされるところでは、メモリ予算というものがある
グラフィック、オーディオ、ネットワークなどのモジュールごとにメモリいくらと決められる
モジュールの責任者はその中でやりくりする
ここで大事なのはメモリの最大使用量を保証しなければならないってこと

必要ならローカルのヒープは作ったりするが、この時点で担当者が気ままにnewってのは認められない
基本的にすべてコントロールされる
現実的に最大量が正確に見積もれないものもあるがそれでも最大量は決める
2020/02/17(月) 10:57:08.38ID:sgjaAMaL
といってもグローバルヒープを使わないわけじゃない
オープンソースのもので無邪気にmallocするものは多数あるが、それほど荒ぶらなければそのまま使う
(リアルタイム性が不要なら仮想メモリに任せる)

あとmalloc遅くないという論調の人がいるけどそれはベストケースの話でしょう
ヒープメモリが不足したり一度に巨大なメモリを確保する場合はシステムコールになるからずっと遅くなる
ワーストが見積もれないものはリアルタイムで使いづらい

まぁ昨今は仮想マシン上で動くゲームが多数あるわけで気にしなくていいレベルという意見はある
ただesports系で一瞬カつくとか商品性に関わるわけで
また後から直すのも地獄なので
最初から計画的に作るべきだろう
2020/02/17(月) 11:06:49.04ID:tDJaHp5K
ここC++スレだよね、つかぬことだけど
記憶管理はいつでも如何様にもカスタマイズできるようにtypename Allocatorになってるわけじゃん
なんでいきなり組み込みには向かないとかキリッてんの?
2020/02/17(月) 12:20:34.06ID:ipOy1V1j
>>968
typename Allocatorとかすげぇ初心者っぽい
キリってるのはお前だ
2020/02/17(月) 12:22:54.84ID:tDJaHp5K
>>969
kwsk
2020/02/17(月) 12:39:53.15ID:sgjaAMaL
>>968
標準ライブラリでもallocatorが指定できないものもあるんだよ
もはや今のc++で標準ライブラリを全面的に使いつつ、ヒープを個別に差し替えるのはかなり非現実的だ
allocatorを差し替えられてもnewするタイミングや量はリバースエンジニアリングしないとわからない
それが問題になることもある
2020/02/17(月) 12:48:18.84ID:2c+OKT/4
てか、静的確保したメモリブロック使うアロケータ書いてそれで標準コンテナ使うのが基本じゃね
まあeastlでも良いが
2020/02/17(月) 12:51:50.81ID:tDJaHp5K
>>971

> 標準ライブラリでもallocatorが指定できないもの
例えば?

newだってoperator newですぐカスタマイズできるし
placementで環境依存の細かい設定もできる

ライブラリはISO/IEC14882に固執する必要はなく
サードパーティでも内製でもより都合のよいほうを使えばいい
というだけの話
974969
垢版 |
2020/02/17(月) 12:56:55.88ID:nfQInp9b
カスタマイズの話なら真っ先にnewの話をすべきなんだが順番おかしくね?
ていうか今時はallocatorより先にpolymorphic resourceだと思うが

というかそもそもmallocの速度の話からであって、いきなりallocatorの話したり
C++全体を否定されたかのように過剰反応するとか・・
2020/02/17(月) 13:12:34.13ID:y136Nw0W
仕様通りに書けばいい感じにうごいてくれて、責任は俺にはないとか
思い込んでんじゃってるキッズなんだろう。
デバッグするなんてことはもちろん頭にない。
976865
垢版 |
2020/02/17(月) 13:34:28.75ID:FC0zZXW0
>>890からの流れでは直後からnewが出てきてたろ
C++が組み込みに向かないという主張の
理由がmallocじゃおかしいだろ
それしか使えんわけでもなし
2020/02/17(月) 13:44:11.06ID:nfQInp9b
>>968に突っ込むと>>890に同意したことになるのか
2020/02/17(月) 14:00:21.02ID:sgjaAMaL
>>973
> > 標準ライブラリでもallocatorが指定できないもの
> 例えば?

でしょ?
お前さんは人並み以上にc++知ってると思うけどこの事実知らない
どこで使われてるか知らなきゃ置き換えができないよね

答えはあえて教えない
標準ライブラリのヘッダーをnewでgrepすればallocatorを通さないものが見つかるさ
自分で確認してこりゃ置き換え無理だわと悟って欲しいw
もし見つからないなら後で書くよ

ちなみにグローバルにnewを置き換えるぐらいならmallocのバイナリを差し替えた方が早いし確実
2020/02/17(月) 14:31:40.00ID:qpTD/rYC
おっ。
野党みたいなことを言い始めたぞ。
2020/02/17(月) 14:37:47.70ID:nfQInp9b
>>979
横からだが、具体的に誰のどこを指してそう思ったのかよろしく
2020/02/17(月) 14:59:36.07ID:QYRwM+i2
>>966
もちろん、むやみやたらと使って全く問題ないわけではない。
が、本当に必要な箇所で使う程度なら(多くの場合)余り問題ないという程度。
大体ゲームの場合のnewやmallocは、敵や弾やイフェクト、3Dオブジェクトなど
を1つずつ収めるために使うことが多いが、ゲームの1シーン内に登場する個数が
newやmallocが問題ない程度に元々なっている事がわりと多いと言うだけ。
3Dの雑草の葉っぱ一枚単位で new したりすると問題になってくるかもしれない。
2020/02/17(月) 15:51:15.09ID:sgjaAMaL
>>981
なんとも感覚的な話だね
だいたい動けばOK!って感じ?
おれは仕事でそういうもの作りはしない
2020/02/17(月) 16:08:54.93ID:HCTe1ZqE
コンシューマかPCかでも違うだろうし
(自分はさほど詳しくないが、基本コンシューマは標準ヒープ使わないはず)
ジャンルによっても違うんじゃね
PCのMMORPGなんかだとシーン中のメモリ確保は必須だろうし
あと草は普通同じメッシュやテクスチャ使うだろうし、揺れを入れるにしても一つ一つにデータ持たせるなんてアホなことしないだろ
2020/02/17(月) 16:15:08.76ID:tDJaHp5K
>>978
「後で」かw
もう1000間近だし期限切らないでおけば時効だろってか?
2020/02/17(月) 16:32:36.59ID:y136Nw0W
いやそれくらい調べろって話だろ。。馬鹿が。
2020/02/17(月) 16:44:43.28ID:tDJaHp5K
>>985
sgjaAMaLが、自分の話に傾聴してきた人の質問に答えなかった
つまり自分の考えを伝える努力を中止したということでしかない

何人も自らの意見を他人に伝えるには
その意見を説明するしかなく
説明をやめることは沈黙に等しい
2020/02/17(月) 16:55:56.23ID:9WiS2n1W
黙って調べてくれば?
調べて無いと結論づけられればまた偉そうに出来るだろw
レス数が950を超えています。1000を超えると書き込みができなくなります。