メンバ変数のメモリ容量 – プログラミング – Home

メンバ変数のメモリ容量
 
通知
すべてクリア

[解決済] メンバ変数のメモリ容量


Puppy
 Puppy
(@Puppy)
ゲスト
結合: 23年前
投稿: 71
Topic starter  

Puppyです。いつもお世話になっています。

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

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

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


引用未解決
トピックタグ
PAI
 PAI
(@PAI)
ゲスト
結合: 23年前
投稿: 359
 

new とかで作る分には全然問題なし。
ローカルに取るとちょっと不安。


返信引用
Puppy
 Puppy
(@Puppy)
ゲスト
結合: 23年前
投稿: 71
Topic starter  

PAIさん お返事ありがとうございます。

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

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

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


返信引用
PAI
 PAI
(@PAI)
ゲスト
結合: 23年前
投稿: 359
 

あ、念のため。

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

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

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

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

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

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

とか。


返信引用
PAI
 PAI
(@PAI)
ゲスト
結合: 23年前
投稿: 359
 

>ローカルとはメンバ変数で持っている場合も含まれるのですか?

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

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

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


返信引用
Puppy
 Puppy
(@Puppy)
ゲスト
結合: 23年前
投稿: 71
Topic starter  

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ペコリ


返信引用
クリリン
 クリリン
(@クリリン)
ゲスト
結合: 23年前
投稿: 175
 

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

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


返信引用
くたくた
 くたくた
(@くたくた)
ゲスト
結合: 23年前
投稿: 119
 

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

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

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

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

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

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


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

>char型は最後に+1バイトするのでは?
>例えば、
>char hoge[10];
>だったら、11バイトでは?

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


返信引用
Puppy
 Puppy
(@Puppy)
ゲスト
結合: 23年前
投稿: 71
Topic starter  

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました