C言語なら俺に聞け 153

レス数が1000を超えています。これ以上書き込みはできません。
1デフォルトの名無しさん (ワッチョイ 5fba-LL4R)
垢版 |
2019/08/17(土) 23:02:42.00ID:tN5mSQYg0
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/

C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf

C99
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/

JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/
-
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
※前スレ
C言語なら俺に聞け 152
https://mevius.5ch.net/test/read.cgi/tech/1560763630/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2020/01/11(土) 17:46:53.86ID:AmOO0hUd0
>>950
とりあえずお前はCに留まってろ
話はそれだけだ
2020/01/11(土) 17:53:57.75ID:DoM09T/H0
有名なリーナスのコピペだろ
954デフォルトの名無しさん (ワッチョイ ff8c-GYCx)
垢版 |
2020/01/11(土) 22:53:33.52ID:AUXeR2Nj0
初心者がC++を使うのはクラスが便利とかではなくて便利そうなライブラリを引っ張てこれるからだろう。
2020/01/11(土) 22:55:44.33ID:maKKMM+r0
便利そうなライブラリを引っ張ってこれる時点でプログラミング初心者ではないし
そもそもC++から始めるプログラミング初心者とか存在すんのか?
2020/01/11(土) 23:26:05.56ID:PA1VQQuv0
>>947
NANDだけだな
957デフォルトの名無しさん (ワッチョイ df01-ErPi)
垢版 |
2020/01/11(土) 23:31:10.93ID:r5wulSj/0
単純に便利だからじゃないの。
2020/01/12(日) 01:47:15.90ID:yxPPqVVq0
>>956
そうなんだ
2020/01/12(日) 01:51:46.75ID:HwD03+Q90
笑って良いか?w
2020/01/12(日) 02:18:33.81ID:1G/fBof90
いいとも!
2020/01/12(日) 03:10:59.78ID:Svv4a/Ag0
gccコンパイルしたんだが今どきのgccってC++で書かれてるんだな
恥ずかしながらつい最近まで知らんかった
962デフォルトの名無しさん (ワッチョイ ff8c-GYCx)
垢版 |
2020/01/12(日) 07:25:04.57ID:t6zFaymS0
>>947
でも日本は失敗したんだよね。
963デフォルトの名無しさん (ワッチョイ 5f02-tgR8)
垢版 |
2020/01/13(月) 14:02:27.58ID:JUx858UH0
質問です。32bitで確保できるメモリの上限近く(windowsなので1.5GBとか)を
色々なデータで確保した後、いっきに半分以上解放し、またいっきに色々なデータで
上限近く確保しようとするとmalloc()が失敗します(NULLを返す)。
プロセスのメモリを見ても500MBくらいまで落ちてから再確保しているようですがダメです。
これは内部で何が起こっているのでしょうか?断片化とかでしょうか??
2020/01/13(月) 14:50:30.36ID:JUx858UH0
追加ですが殆どのデータを解放して使用量50MBくらいにしてから
しばらく待ってから再確保すると上手く行くようです。ただ500〜1000MBくらい残してから
また上限近くまで確保しようとすると失敗します。何故でしょうか?
2020/01/13(月) 15:39:54.87ID:xgMgrp400
よくわからんけど、ヒープメモリの仕組みを調べるといいかも。
966デフォルトの名無しさん (ワッチョイ df01-ErPi)
垢版 |
2020/01/13(月) 15:42:12.61ID:WUoSHY6Y0
アリ人間は何故なまえを変えたのか。
2020/01/13(月) 15:47:05.97ID:5GjUS2iX0
フラグメント
断片化

アドレス空間2GBの壁
諦めなさい
2020/01/13(月) 15:54:23.75ID:5GjUS2iX0
極端な例

256MBのメモリを8個確保 (2GB分) したあと
1, 3, 5, 7個目を解放

この状態だと
1GB空きがあるのに
連続で空いてるのは256MB
だから512MBの確保に失敗する
969デフォルトの名無しさん (アウウィフ FFa3-tgR8)
垢版 |
2020/01/13(月) 16:31:54.68ID:axFuJyFlF
断片化だろ
しばらく待つことに何の意味も無い
2020/01/13(月) 16:37:34.93ID:JUx858UH0
>>967-969
やっぱり断片化ですか… 一旦使用量50MBまで減らしたら
断片化がかなり無くなったので確保が上手く行ったという事になりますかね。
更にうまくメモリ管理するか64bit化も考えようと思います。ありがとうございました。
971デフォルトの名無しさん (アウウィフ FFa3-tgR8)
垢版 |
2020/01/13(月) 17:38:12.46ID:axFuJyFlF
細切れにならないように自分ででかく確保して
その中をさらに自分で管理すると良い
2020/01/13(月) 19:01:20.39ID:JUx858UH0
>>971
もっと効率よくやるならその方法がやっぱいいですね。ありがとうございます。
2020/01/13(月) 22:56:26.88ID:ke+wtNqb0
そこまで大きいデータならオンメモリで処理する手段は捨てるなあ
間違えて数GBのISOファイル読み込んじゃってPC固まったとかそういう挙動は許されざるよ
2020/01/13(月) 23:07:18.29ID:Yl8Am7cI0
無理に32ビットでやらなくても良いのではないか?
2020/01/14(火) 11:56:44.05ID:AM8t1N0H0
要するにブロックを詰めるパズルゲームだろ
2020/01/14(火) 16:16:37.73ID:MAaOflfD0
メモリをポインタではなくハンドルで管理すれば
メモリコンパクションができる

ただし、そんなことをしなくても実容量を超えるメモリが提供できるようにするために仮想記憶があるんだが
2020/01/14(火) 16:30:41.75ID:RxBpnTJ90
実容量を超えるメモリーを使いたいだけならオーバーレイとかセグメント方式のメモリー管理機構とか色々あるが
2020/01/14(火) 17:25:51.38ID:Ae/uveiQ0
>>976-977
32bitプログラムだとメモリ空間が最大でも4GBしか扱えないので
それ以上は無理ではないでしょうか?扱える方法何かあるでしょうか?
979デフォルトの名無しさん (ワッチョイ df35-e1y7)
垢版 |
2020/01/14(火) 17:28:42.27ID:Cb2SImdL0
あるけど
2020/01/14(火) 17:37:38.20ID:JKuyIKmvd
メインメモリとは別の記憶媒体に退避しておけば、実質使える?かな?
2020/01/14(火) 17:46:20.96ID:SgRnb4BR0
>>978
その理屈だと、4GBを超えるファイルは扱えなくことになる
2020/01/14(火) 18:01:20.77ID:vjAz2zAO0
32bit Windows の普通のプロセスのアドレス空間は2GB

OSやAPIを改造してFARポインタを扱えるようにするか
ロックアンロック方式のメモリ管理を自力で実装するか

そんなことをするよりは
素直にアプリのメモリ確保の方法を変えるのが早い
もちろん64bit化出来るならそれが一番
2020/01/14(火) 18:05:55.14ID:RxBpnTJ90
>>978
オーバーレイは同じメモリー空間のデータ/プログラムを入れ替えて実行する機能
メモリー空間の話であればバンク切替とかもあるし
2020/01/14(火) 18:13:13.94ID:Ae/uveiQ0
>>982
どうしても使ってる一部のライブラリが32bitで64bit化するのが無理でした。
>>983
そちらを調べてみようと思います。
2020/01/14(火) 18:15:32.64ID:Ae/uveiQ0
>>980-981
そうやっても必要な時にメインメモリに読み込んで使う必要がないですかね?
しかも上手くやりくりして読み込んでもそこで断片化の問題もありますし。
その場合プールを自分で管理するしかなさそうな気がします。途中でその話をしてましたが。
2020/01/14(火) 18:31:15.17ID:jSZPoIDP0
32bitOSで4GB以上のオブジェクトをメモリに読み込んでどうにかしろ、と言われたら。
最初に検討するのはファイルマッピングだろうなあ。それ以外だとやる気がおきない。
APIを叩く必要があるので、WindowsならCreateFileMappingとかMapViewOfFileとか。
2020/01/14(火) 18:32:25.86ID:Ae/uveiQ0
>>986
ありがとうございます。調べてみますね。
2020/01/14(火) 18:32:29.78ID:RxBpnTJ90
>>984
> そちらを調べてみようと思います。
いやいや、オーバーレイとかバンク切替とかは半分ネタだから今更そんなもん調べなくていいよw

>>985
> しかも上手くやりくりして読み込んでもそこで断片化の問題もありますし。
アホほどでかいサイズでなきゃそれほど問題にならないよ

> その場合プールを自分で管理するしかなさそうな気がします。途中でその話をしてましたが。
どうしてもでかい領域を確保/解放する必要あるならそれしかないように思う
2020/01/14(火) 18:39:12.20ID:JKuyIKmvd
どうしてそんなデカいデータが必要なんだろう。遺伝子情報でも操作してんのかな?
2020/01/14(火) 18:41:07.63ID:Ae/uveiQ0
>>988
>いやいや、オーバーレイとかバンク切替とかは半分ネタだから〜
ネタでしたかw 了解しました。

>アホほどでかいサイズでなきゃそれほど問題にならないよ
細かいのと途中で500MBくらいを二つとかがあるので時々断片化のせいでmallocが失敗するんですよねえ…

>どうしてもでかい領域を確保/解放する必要あるならそれしかないように思う
とりあえず作業領域様に500MBの領域を確保して再利用すると他の部分でmalloc失敗はなかったですね。
仰るように小さい領域はかなり確保しても問題にならないですね。大きな領域用にメモリスペースを予め確保しておく方法がよいかもしれないと思いました。
2020/01/14(火) 18:45:58.67ID:SgRnb4BR0
>>990
メモリーマップドは、かなり癖があるから注意して使った方がいいよ
ロジックなどの作りは簡単になるけど、
下手をすると処理が一日で終わらないなんて平気で起きる
2020/01/14(火) 18:48:32.63ID:iQtyfXTR0
もう64bitが当たり前になってかなり経つ昨今、そんな案件ごろごろある
映像をリアルタイムでごにょごにょとか言われたら簡単にギガ単位のメモリ使う
稀有な例では無いけど32bit環境でやれって言われたらヤダナとは思う
2020/01/14(火) 18:55:05.49ID:Ae/uveiQ0
>>991
そうなんですね。了解しました。

>>989 >>992
詳細はあまり言えないのですがメモリ中に
動画データを一部展開しなければいけなくて
メモリ不足や断片化の問題で困ってました。
しかも周辺で使ってるライブラリが32bitで64bit化が難しくて。
2020/01/14(火) 19:02:49.75ID:JKuyIKmvd
そろそろ次スレ
2020/01/14(火) 19:20:01.41ID:2s3ZuCDc0
8k240Hz動画だと1秒キャッシュするだけでメモリ消費24GBか
まあ今時わざわざCを使うなんて極限環境だけだからそういうこともあるよね
2020/01/14(火) 19:23:27.41ID:SgRnb4BR0
>>992
無理かどうか分からないけれど、その32ビットの処理だけ抜き出して
外部プログラムにし、処理結果を受けとるみたいには出来ないのかな?
2020/01/14(火) 19:27:10.09ID:Ae/uveiQ0
>>996
せめてDLLが別のプロセスモードとかで動いてくれればいいんですが…
よい案がないか引き続き考えてみますー
2020/01/14(火) 19:33:22.57ID:SgRnb4BR0
次すれ、立てました

https://mevius.5ch.net/test/read.cgi/tech/1578997950/
2020/01/14(火) 19:45:37.22ID:MAaOflfD0
>>978
ちょっと待てや
おまえ単一仮想記憶を前提に話してるか?
今や多重仮想記憶が当たり前で単一仮想記憶はかなり特殊な存在だぞ
2020/01/14(火) 19:50:12.26ID:gkNCY9ap0
for (int i = 0; i < 1000; i++) {
puts("1000");
}
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 149日 20時間 47分 30秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。