C言語なら俺に聞け 143
■ このスレッドは過去ログ倉庫に格納されています
>>447
正解は>>411らしいしまともなら知識を持ってたら普通に同意する内容だし mmap の page fault で割り当てられたページフレームってスワップアウトとか発生した時にドロップしたりしますか? >>461
mmap で割り当てた物理メモリは munmap、プロセス終了時以外にも解放される契機はあるのでしょうか?
madvise の MADV_SEQUENTIAL で解放するとか書かれてますが、ソース見てみるとフラグ的にはノーマルと変わらない処理してるみたいなんですよね 結局何を聞きたいの?
mmapで割り当てた仮想メモリが解放されるかどうかであれば、解放されない
物理メモリの話なら解放される
madviseが実際に指示通りに動くかどうかは実装次第だけど
一応LinuxとかはMADV_DONTNEEDで物理は解放できる
というか、これはC言語の話じゃないから各環境のスレで聞け >>465
mmap 時の物理メモリ使用量とその変化を知りたかったんです。
結局非DIRTYなら物理メモリは解放されることあるんですね。
ありがとうございます
一応linuxの場合で考えてました
ホットで適当なスレが見当たらず、一番mmap使いそうなcスレでいいかと
失礼しました >>466
一応一般的には
非dirtyならまだ物理メモリは割り当てられてない、が正しい
物理メモリの再利用についてはdirtyでもswapがあれば行われる(そのためのswap) コーディングの仕方的な教材になる本あるかな?
コーディングとはこうやって沿っていくと良いよ的な本
それを読んでからテクニックの本を読もうとしてる(effective) >>467
つまりreadonlyでmmapし場合、dirtyにならないから物理は割り当てられないと
すごいな 割り当てられてないメモリーにアクセスするとページフォルトが起きてから
OSが割り当てる遅延ファイルマッピングの事をいいたいんじゃないのかな。 ポインタのことなんだけど、*pt と pt みたいに同じ名前で宣言したら、別々の変数になる? >>466
まあここでいいと思うぞ
madviseはあまり関係ない
落とされる前提でポリシー決めてるだけ
MAP_SHAREなら解放される可能性がある
MAP_LOCKEDで解放されない
他のフラグは知らん、試せ これまた初歩的な質問なんだけど、intとdoubleとかで変数名が衝突したらどうなる? 確かにエラー出るんだけど、できないってことでいいの? 外のスコープで定義されたものと名前が衝突した場合は内側の方が有効になり
同じスコープで衝突した場合はエラーになる int* ptの意味は意味int *ptだよ。
ptをデリファレンス演算子で評価したらint型になるよという宣言だよ。 変数名が型ごとに独立した名前空間に属する、という言語があるのかな。
原理的には可能だと思うけど、えらく組みにくそうな気がする。
「型だけが異なる同名の変数を使わない」みたいなコーディング規約を強制されそう。 構造体のネームスペースみたいに
全部の変数に型名をつけるようになるだろうな。 リーダブルコーディングとeffective以外に本を探してるのだけど他にあるかな? 組込み開発者におくるMISRA‐C:2004―C言語利用の高信頼化ガイド、2006 >>488
perlは$aと@aと%aが違うけどな。型と言うよりはスカラか配列かハッシュかの違いだな。 >>493
ネットで MISRA の詳しい解説はありませんか? 処理重視なら毎回毎回変数宣言って処理が鈍くなるよな? C++でもないのでコンストラクタ走るわけでもないです スタック操作なんか関数呼び出し時にまとめてやってるから、どこで宣言しようが処理速度は変わらないけどな。 >>499
その程度ならコンパイラが良きに計らってくれますよ for文の中の変数宣言って外で行うよりオーバーヘッド大きいの? >>504
言語上ブロック内で有効なだけで、
他の自動変数同様スタックに余分にとられるだけだからまず変わらない。 >>499
宣言だけ?メモリ確保とかは自分でやらずに?
だったら最初に確保する一回分だけの時間しか掛からないと思うぞ。 あ、C++みたいな言語でクラスの中でメモリ確保してデストラクタで解放やってるような場合は
ループするブロックの中で宣言したら最低でもメモリ確保と解放でループの回数分時間
掛かっちゃうだろうけど、C言語にはそういうのはないので掛からない。 動的に確保というのはあるだろうが、
俺を意識した使い方するだろうし >>506
for文とかの中で宣言してやったりすると毎回確保するから処理の速度が遅くなるってどっかで書いてあった
なるべく何回も宣言しないで中身を変える処理をする方が処理がはやくなるとか言ってた そのレベルの理解なら気にする必要はない
そもそもCを使う必要もない >>511
> for文とかの中で宣言してやったりすると毎回確保するから処理の速度が遅くなるってどっかで書いてあった
よほどショボいコンパイラでない限り気にする必要はない
> なるべく何回も宣言しないで中身を変える処理をする方が処理がはやくなるとか言ってた
そう言うアホな本は窓から捨てるべき >>513
それは中の処理が大量になっても大丈夫なのか?
20行、30行ぐらい長い処理でも? 宣言と長い処理って何処に関連が?
初期化の右辺がすんげー長いというのは
変数宣言がループの中にあろうが変数宣言をループの外に追い出しても
同じで必須コストだしそこは論点じゃないよね >>516
全部ヒントに「コンパイラが最適化でやる」って書いてあるし
逆にそのコストが重いようならもっと根本的な手入れ(アルゴリズムの見直しとか)が必要だし >>514
測定して本当にそれが問題になってるとわかった時に考えればいい >>516
「実際のところ」と書いてある所をよく読むべき。 コードとは直接関係はないけどメモリリークのテストってlinuxだとどうやるのだろう? >>522
valgrind か LeakSanitizer 脳内ループ最適化かー。結構良く目にするのは
int i;
for(i = rows; 0 < i; i―)
Hoge;
だったりするけど
組み込みでも、このくらい最適化かかるのにねぇ >>523
>>524
ありがとう調べてみる
別件なのだけど、systemの子プロセス戻り値をみるときって
ret=system(コマンド)
if(wifexisted(ret))
{
wexitstatus(ret)
}
これだけで良い?エラー処理ってほかにいるかね?
wifsignaledとかwtermsigとかいるのかね?ってなってるんだ
その他のマクロについても.... >>526
systemって-1返す事なかったっけ? >>522
オレは単純にpsコマンドで、vszとszの推移を見てるだけだなー
確保の仕方にもよるだろうけど。。。 >>529
メモリマップとかは見てると分かった気になれるし、仕事してる感も出るからおすすめ >>528
うおおおおお
たしかにあった
>>527
-1は素で忘れてた
>>443見てみたけど最後if elseで終わってるからその後がどうなんの?って気になる
if elseってことは他もあるじゃん?ってなるのだがいかんせんman理解できない... >>531
https://linuxjm.osdn.jp/html/LDP_man-pages/man2/wait.2.html
Linux の場合大きく分けて WIFEXITED と WIFSIGNALED 以外があるのかというと今のところない。
しかし将来的に増えないとも限らないので念のため if で分岐させておいた方が良いと思う。 >>533
3点ほど
配列使う必要ある?保持したいのは最大値だけなんだよね?入力ループ内で最大値判定までやったら?
ローカル変数名は input_num とか分かる名前つけようか
main の戻り値 C99以降だっけ?
省略された int main() の返り値として自動的に return 0; が補われる、
という仕様があるはずだけど、それに積極的に依存するよりも
return 0; と1行書く方が良い習慣だわね。 >>532
さんくす
これ読みにくいよなぁ....
子プロセスの配送が停止したとき
具体的に言うとwifstoppedの時は別なのかな? stdlib.hのSUCCESSなんちゃらをほんにゃら >>536
試してみればわかると思うけど system() で動かされた子プロセスは SIGSTOP 受け取っても
停止するだけで親プロセスには帰らないよ。system() 内でやってる waitpid() は WUNTRACED
や WCONTINUED オプション使ってないってことだと思う。なので STOP や CONT に関係する
WIF... はやる必要がない。 char str1[10]="AAAAAA";
char str2[10]="BBBBBB";
char str3[10]="CCCCCC";
があって、これをそれぞれ
char strh[0][10]〜char strh[2][10]に代入する方法を教えてください。 strcpy(strh[0],str1);
strcpy(strh[1],str2);
strcpy(strh[2],str3);
と適当に書いてみる。 ポインターのコピーじゃダメなんですか?
なんで中身をわざわざ複製して、処理時間を無駄に消費するんですか? >>538
ありがとうありがとう
そうすることにする
stat関数でのファイル存在確認って破損していたファイルだとエラー返ってくる?
仕様を調べていたけどそのような記載がなかった >>541
ポインタのコピーだとコピー元の配列(str1[],str2[],str3[])の中身を変更するとコピー先(*strh[0]〜*strh[2])の内容まで変わる
値のコピー(strcpy()など)だとコピー元の配列の中身が変わってもコピー先の配列(strh[0][]〜strh[2][])の内容は変化しない
配列とポインタでは挙動が違う 初期化でやってしまう話じゃないんだろうな。 多分
char strh[3][10] = { "AAAAAA", "BBBBBB", "CCCCCC" }; 配列変数はただのポインタ変数じゃないってマジ?
arr==&arrになるんやが。
arrがポインタなら&arrはポインタのポインタだからこれはおかしい。 int a[10];
int *p;
p++; 問題なし
a++; エラー
配列は配列 ポインタはポインタ arrと&arrじゃ型違うし、比較結果が一致する保証もないけど? >>545
ポインタの変数はポインタを入れとくための変数だ。
配列変数はポインタを入れとく変数ではなく、単に配列の先頭を表すラベルでしかない。 >>545
int arr[10]; みたいに配列を定義して
if (arr == &arr) {...} てな具合に比較する話かな。
配列名 arr は &arr[0] (先頭の要素へのポインタ)
配列名に&演算子を作用させた &arr は配列全体(10要素の配列)へのポインタ
…と解釈される、とANSIで決まった、と望洋さんの本に載ってる。
『秘伝C言語問答 ポインタ編』p.25 Column1-2 「配列名に&をつけると……」
>>548
型が違うのは間違いないけど、値が一致しない場合ってあるのかな?
それとも型の異なるポインタ同士での値の比較って未定義動作なんだっけ? >配列名 arr は &arr[0] (先頭の要素へのポインタ)
>配列名に&演算子を作用させた &arr は配列全体(10要素の配列)へのポインタ
>…と解釈される、とANSIで決まった、と望洋さんの本に載ってる。
なるほどな >>552
>6.5.9 等価演算子
>(中略)
>制約??次のいずれかの条件を満たさなければならない。
>(中略)
>-両オペランドとも適合する型の修飾版又は非修飾版へのポインタである。
「〜型」と「〜型の配列型」は適合しないから、ポインタの比較は未定義 >>552
型が異なったら、比較できない
例えば、アドレス100番地から10バイトと、
アドレス100番地から20バイトでは、全然違う
仮に、同じバイト数だとしても、中身・内容が異なるし、比較する事に意味がない >>542
ファイルの破損というのがファイルの中身の論理レベルの話なら正常なファイルとみなされるはずだし、ファイルシステムレベルの破損やメディアの物理的破損なら実装依存じゃないかな。 >>555
いま話題にしているのはarrと&arr[0]の比較であって、これらはどちらも比較演算子のオペランドとしてはint*型として評価されて型も値も一致すると思ってたけど、どうだろう。 ■ このスレッドは過去ログ倉庫に格納されています