メンバ変数のメモリ容量

[戻る]
Puppy 2002/05/23(木) 15:35:38
Puppyです。いつもお世話になっています。

Win2000,VC6.0,MFCの環境です。
メンバ変数の配列など大きなサイズの変数の総和をざっと出してみました。
int型を4バイトchar型を1バイトで計算しました。
これは問題ないでしょうか?

結果は、サイズが2Mバイトを越えてしまっています。
このサイズがメモリ不足の原因になってしまうかどうか心配です。
皆様はもっと大きなサイズで扱われたことがありますでしょうか?
また、どのあたりのサイズで「危なそう」という判定をすればよいのでしょうか?
今までに、たくさんのデータを扱ったことがないので、検討がつきません。

「全然問題ないよ」といってもらえたらうれしいのですけど。。。
お返事、お待ちしています。
よろしくお願いしますぅ。m(..)mペコリ

PAI 2002/05/23(木) 16:24:54
new とかで作る分には全然問題なし。
ローカルに取るとちょっと不安。

Puppy 2002/05/23(木) 16:34:24
PAIさん お返事ありがとうございます。

>ローカルに取るとちょっと不安。

そうなんですか。(涙)
ローカルとはメンバ変数で持っている場合も含まれるのですか?
「ちょっと不安」というのは経験からでしょうか?

変数の持ち方を考え直さないといけないでしょうか?
よろしくお願いします。

PAI 2002/05/23(木) 16:35:07
あ、念のため。

>int型を4バイトchar型を1バイトで計算しました。
>これは問題ないでしょうか?

構造体の中でパディングが生じてない限りOK。


>皆様はもっと大きなサイズで扱われたことがありますでしょうか?

今vectorで16バイトの構造体を5万件ぐらい一気にメモリにとって処理してる。


>また、どのあたりのサイズで「危なそう」という判定をすればよいのでしょうか?

環境による、ふつうのPCでスタック上でなら1Mぐらいまで、
ヒープ上は最近のOSは仮想メモリが働くので100MぐらいまではだいたいOK、
// 組み込みだったら動的にメモリなんか取れない。

とか。

PAI 2002/05/23(木) 16:40:45
>ローカルとはメンバ変数で持っている場合も含まれるのですか?

メンバに持ってても、そのオブジェクト全体をNewした場合はヒープにできます。


>「ちょっと不安」というのは経験からでしょうか?

確か、VCのスタックサイズはデフォルトで1Mだったような気が・・・

Puppy 2002/05/23(木) 16:53:47
PAIさん お早いお返事、ありがとうございます。m(..)m

>メンバに持ってても、そのオブジェクト全体をNewした場合はヒープにできます。
あ、なるほどですぅ。

CABCApp::InitInstance()で

CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(
    IDR_WU3TERTYPE,
    RUNTIME_CLASS(CABCDoc),     // このドキュメントのメンバ変数が
                                     // 大きい配列を持っています
    RUNTIME_CLASS(CChildFrame),
    RUNTIME_CLASS(CABCView1));
AddDocTemplate(pDocTemplate);

このように ドキュメントテンプレートが new されていまして、ドキュメントクラスの
メンバ変数に大きなサイズの配列が2Mバイトくらいあります。

この場合ですと、ドキュメントクラスも new されていると判断して良いでしょうか?
この場合でしたら「問題なし」と判定して良いでしょうか?
よろしくお願いしますぅ。m(..)mペコリ

クリリン 2002/05/23(木) 17:07:11
どうもです。計算についてですが、
char型は最後に+1バイトするのでは?
例えば、
char hoge[10];
だったら、11バイトでは?
たしか、VCのコンパイラではそうなると聞いたのですが・・・

間違いだったら、ゴミレスです。

くたくた 2002/05/25(土) 21:55:24
>int型を4バイトchar型を1バイトで計算しました。これは問題ないでしょうか?
問題ありません。

>この場合ですと、ドキュメントクラスも new されていると判断して良いでしょうか?
良いです。

>この場合でしたら「問題なし」と判定して良いでしょうか?
良いです。但し正しく動かすだけならという事です。
理由はMFCの構造に助けられた為です。

最良なのは、既出の2[Mbyte]配列は "自前でヒープへ配置する" 事です。

>// 組み込みだったら動的にメモリなんか取れない。
ターゲットが"少ヒープ"ならそうですね。
但し "組み込みでも動的確保が常" というターゲットはたくさんあります。

>char型は最後に+1バイトするのでは?
しません。

PATIO 2002/05/27(月) 13:39:00
>char型は最後に+1バイトするのでは?
>例えば、
>char hoge[10];
>だったら、11バイトでは?

そうではなくて、C言語やC++言語では、文字列の最後をNUL文字で認識するので
10文字の文字列を扱いたい時は、終端文字(NUL)の分まで余計に確保しなくては
ならないというのが正解です。
従って、宣言上で10個の配列で宣言していれば10バイトと考えて問題ありません。
但し、既に話が出ているように構造体のようにワンセットで扱う場合は、バウンダリの
問題があり、コンパイル時にパックをしないとメンバー上にない余分な領域が出来て
しまいます。この場合は、バウンダリ合わせも考慮に入れて計算しなくてはなりません。

Puppy 2002/05/28(火) 17:12:47
[[解決]]
>>この場合でしたら「問題なし」と判定して良いでしょうか?
>良いです。但し正しく動かすだけならという事です。
>理由はMFCの構造に助けられた為です。

くたくたさん お返事ありがとうございました。

古いスレッドには追加発言できません。