No.13ベストアンサー
- 回答日時:
> 私は、組込みは少し経験があったのですが、
> Windowsプログラムは経験がなくメモリの扱い方や
> 制限が気になっていました。
組み込みシステムとは違って、PCのプログラムは「富豪的プログラミング」なんてのがあるぐらいなので、メモリはそれほど気にしなくてもいいです。
わたしは個人的には富豪的プログラミングには全面的に賛同できないんですが…
富豪的プログラミングについては以下
http://pitecan.com/fugo.html
エコプログラミングなるものを提唱しているひとも。
http://nais.to/~yto/doc/zb/0017.html
> 私としては、メモリ確保のオーバヘッドや初期化処理等に
> 時間がかかるのかなとか、なんらかのデータ構造の
> アルゴリズムをした際の検索に時間がかかるのかなとか
> 思っていました。
オーバヘッドや初期化処理は静的に確保しても対して変わりません。プログラムのロード時に実際のところ初期化するのですから。staticに確保すると通常は0で埋められますが、プログラムをロードする際に0でクリアしています。それをプログラムで明示的に行うだけですし、現在のPC用のOSはメモリを確保しても初期化したり、データを入れるまでは実際にはメモリを割り付けていないケースが多いです。
# ディスクからデータを読み込む場合、オンデマンドで
# 割り付けてもディスクI/Oの待ち時間に十分処理できたり。
No.12
- 回答日時:
> 『char Data[1000][4096];』を使用しインデックスで、
> 読出し,書込みを高速に行おうとしています。
> このような使い方の場合、mallocを使用すると、
> 検索に時間がかかってしまいそうな気がしますが、
> いい方法はないでしょうか?
何の検索でしょうか。
mallocに時間がかかると思ったのはどうしてですか。
速度を追求したいのであれば、こんなのもできます。
#include <stdio.h>
#include <stdlib.h>
#define d1MAX (1000)
#define d2MAX (4096)
#define Data(d1, d2) (buf[d2MAX * (d1) + (d2)])
// マクロでフラットな配列に展開
int main()
{
char *buf;
buf=(char *)malloc(d1MAX * d2MAX);
// mallocで一括確保
memset(buf, 0, d1MAX * d2MAX);
// staticと等価にするため一応クリアしておく
Data(20, 30) = 100;
printf("%d\n", Data(20,30));
return 0;
}
これならそれほど違和感ないんじゃないかな。
実際のところ、メモリのアクセスを高速化するよりディスクへのI/Oを減らすことの方がずっと高速化には寄与しますね。
ちなみに、ファイルの読み込みを例にして
fread(Data[10], 1, 4096, fp);
いう風にしようと思っていたのであれば、
fread(&Data(10,0), 1, 4096, fp);
として代用できます。
心配なら、&(Data(10,0))としてもいいでしょう。&((buf[(4096)*(10)+(0)]))と展開されるので、括弧はひとつ無駄になりますが、たいした問題ではありません。
回答ありがとうございます。
> 『char Data[1000][4096];』を使用しインデックスで、読出し,書込みを高速に行おうとしています。・・・・
について言葉が足りませんでした。申し訳ありません。
私としては、メモリ確保のオーバヘッドや初期化処理等に時間がかかるのかなとか、なんらかのデータ構造のアルゴリズムをした際の検索に時間がかかるのかなとか思っていました。
どちらにしても、今のPCであれば、たいした時間ではなかったですね。
No.11
- 回答日時:
> Windows のプログラムでは、グローバル変数は
> 最大どれくらい確保できるものなのでしょうか?
グローバル変数というのが
スタティックでコンパイル時に確保されるものを指しているのであれば、プログラムが起動するのに必要なメモリが確保できればそれで起動可能。
ヒープにmallocで確保するものを指しているのであれば、ヒープに空きがある分(32ビットwindowsなら2G以下だったかな)
> また、グローバル変数を多く取りすぎると、
> OSへ影響が出るのでしょうか?
スタティックな方であれば、単にそのプログラムが起動できないか、他のプログラムが起動できなくなるだけです。OSが文句を言えば、そのプログラムを終了すればすぐに復帰するでしょう。
mallocで確保する方であれば、限界までとると他のプログラムが起動できなくなるでしょう。こちらもプログラムを終了すると多分復帰できると思います。
> 下記の変数を確保使用としています。
> char Data[1000][4096];
今のPCなら、4MBでは多分なんてことはないでしょう。
#明示的な回答者に向けての回答は削除対象だったはずでは…。
回答ありがとうございました。
私は、組込みは少し経験があったのですが、Windowsプログラムは経験がなくメモリの扱い方や制限が気になっていました。
>今のPCなら、4MBでは多分なんてことはないでしょう。
を聞いて勉強になりました。
ありがとうございました
No.10
- 回答日時:
>ency さま。
"c" "c++" どちらで組んでも、大切な事は、デバッガが、使い易いかどうかがとても大切のように思います。
それがしは、以前、"HP の xdb" 今は、Fedora Core 3 (GNOME) がとても使い安く、愛用してますが、"ency" 樣は、いかがですか?
>Tacosan さま。
"c" 出組まれた、とても移植性の高い、優れたプログラム、"Windows95" "Windows98" (IBM のワークステーションも) Cコンパイラ、どうにもなりませんでしたが、これを、"仕様" あるいは "障害" と見るかは、その人の判断しだいと思われますが、>Tacosan さまは、どうおもいますか??
No.9
- 回答日時:
私だったら、インデックスとデータを組にした構造体を定義して、必要な分だけ構造体サイズ分 malloc() しますね。
# C++ や Java だったら、クラスを定義してインスタンスを…と同じことですね。
で、データを探索する必要があるのであれば、たとえばリスト構造のような形にして、データはインデックスでソートしておけば、何とかなるかなぁ…と。。。
No.8
- 回答日時:
疎なデータだったら「添字」と「その添字に対応するデータ」の組を記憶するって方法もあるんですけどね.... 密だと malloc 使うのが普通かなぁ.
malloc に関していえば, 確か Linux は 1プロセスでメモリを使い果たさない限りメモリを確保したことにしちゃうはず>#7. OS の「障害」とかじゃなくって「仕様」です, 「仕様」.
No.7
- 回答日時:
>pokoさんへ。
早速のご返事、ありがとねー。いろいろ、やりかたあると思いますが、なんでも奇抜な冒険も無駄には、ならないと思います。
ちなみに、それがし、メインメモリ"32GB"(ふつ~のパソコンの64倍)を想定した、プログラミングしているのですが、"Linux Fedora Core 3" の "OS" 、"malloc" に障害あって、メモリ確保に失敗しても、"NULL" 戻ってきてくれないら!
今度は、それがしの質問にも、暇な時、ご返事いただけたら、感激です。
では。
No.5
- 回答日時:
こんにちは。
こんごとも、よろしくね。最近この "OKWave" サン知りました。たぶん、わたしだったら、下記のように、すると思いますが、もっといい方法あるかもしれません。(スペース入れ方、分らないので、"_" いれてます。
#define Y_MAX 1000
#define X_MAX 4096
char *Data[Y_MAX]; /* extern */
main(){
__int i,j;
__for(i=0; i < Y_MAX; i++){
____Data[i] = (char *) malloc(sizeof(char) * X_MAX);
____if(Data[i] == NULL) exit(-1); /* error ハンドリングしてねー */
____else{
______for(j=0; j < X_MAX; j++){
________Data[i][j] = 0; /* bit clear */
______}
____}
__}
__Data[i] = NULL;
}
この回答への補足
回答ありがとうございます。
なるほど、この方法であればグローバル変数のサイズは、『Y_MAX』になりますね。
やはり皆さんの回答通り、mallocを使用したほうがOSには負担にならないのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c言語のポインタへの文字列入力...
-
C++で、メンバもヒープに確保さ...
-
行列内の行の交換,列の交換を...
-
GetCommandLineを使用しました。
-
Win32APIでのメモリ管理について
-
DLLのマルチスレッドの動作につ...
-
CでOpenMP、パラレル内での共有...
-
ビットをローテートするプログ...
-
C言語 配列の長さの上限
-
配列の要素数に変数を入れたい...
-
関数から配列を返すには?
-
配列を使わずに、変数名を動的...
-
プログラムによく出てくるst...
-
C言語でのconstを返す関数
-
define で 配列
-
System.IO.Directory.GetFiles...
-
構造体のextern方法
-
C言語 数値の連続入力について
-
CStringからchar*への型変換に...
-
整数型の配列をランダムに並べ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語のポインタへの文字列入力...
-
newしないオブジェクトについて
-
allocってなんですか?
-
malloc呼び出し時のセグメンテ...
-
ヒープメモリの解放について
-
配列の添え字の最大数とは?
-
C++で、メンバもヒープに確保さ...
-
ビットをローテートするプログ...
-
プログラムが途中で強制終了し...
-
構造体でchar name[]と*nameの...
-
stringの最大サイズ
-
C言語 mallocとfreeについて
-
mallocで確保するメモリの領域...
-
void*型のデータサイズ
-
DLLのマルチスレッドの動作につ...
-
大容量の静的な確保の限界値
-
スタック破壊の上手な見つけ方...
-
C++のnewで確保したメモリーの...
-
行列内の行の交換,列の交換を...
-
文字列ポインタとgets関数の関...
おすすめ情報