動的メモリの上限について – 固定ページ 2 – プログラミング – Home

動的メモリの上限について
 
通知
すべてクリア

[解決済] 動的メモリの上限について

固定ページ 2 / 3

たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

> ちなみにですが、CArrayの各要素のポインタって取れましたっけ?
> CArrayのソースを見ればわかるかもしれませんけれど。

CArray::GetDataで、先頭が取れますが、
これを積極的に使うならばCArrayを使う意味がないですね。


返信引用
大三元
 大三元
(@大三元)
ゲスト
結合: 18年前
投稿: 54
Topic starter  

なるほど、そういう方法もありますね。
CArray<KATA*>のほうが楽かもしれませんね?
でも2バイトずつ増えますね。

>ちなみにですが、CArrayの各要素のポインタって取れましたっけ?
各要素のポインタとは?どういう意味?


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

CArray内の要素の管理はCArrayがやっていますから
内部にあるデータにいつも直接アクセスしているとは限らないと言う意味です。
例えば、GetAtした場合、返却される参照先のインスタンスは一時オブジェクトで
ある可能性があるということです。基本的にクラスが内部に持っているデータを
直接扱うことを避ける設計をします。この方がデータの安全性が高いからです。
CArray::GetDataで先頭ポインタが取れますが、CArrayにAddしたタイミングで
内部的なメモリの再確保が発生して先頭のポインタが変わる事だって考えられます。
クラスを使う場合、その辺の事まで考えておかないといけません。


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

CArrayを使う設計で動的にメモリを確保して使うのであれば、
インデックスを保持する方法の方が自然な実装だと思います。
CArrayそのものもインデックスでアクセスする事を基本にしたクラスですから。
ポインタの配列でデータを扱うのであれば、m_defはKATAのポインタで宣言して
newで配列確保した方が自然でしょう。
後考えられるとしたら、ポインタの配列でm_defを作成しておいて
m_1・・・側もポインタの配列にするとかかな。
この場合は、m_def要素を追加するたびにnew KATAが必要になりますけどね。
やり方は色々あるので試行錯誤してベストを探るのもまた勉強ですね。


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

失礼、脱字。

誤)
> この場合は、m_def要素を追加するたびにnew KATAが必要になりますけどね。

正)
この場合は、m_defに要素を追加するたびにnew KATAが必要になりますけどね。


返信引用
大三元
 大三元
(@大三元)
ゲスト
結合: 18年前
投稿: 54
Topic starter  

>これは必要ないと思います。
>というか、これを何に使うのでしょう?
>ねこたまさんの書き方が出来る時点で必要ないと思いますけれど。
>なぜ、必要なのかが理解できないです。
これに関してそもそもの質問の根源なのですが、
検索条件を判定し、m_1~m_5にセットするのですが、
判定する元のデータがm_defを直接見るか、
m_1~m_4でインデックスを取得するかで処理が変わります。
それをうまく統一できないかな~と思いまして。。

m_KenskuNumの値により検索元のデータを決めます。
一度も検索してない時は0(m_defを参照し、m_1にセット)。
0のときと、1~4のときでif文で分ける必要があります。


返信引用
大三元
 大三元
(@大三元)
ゲスト
結合: 18年前
投稿: 54
Topic starter  

>CArrayを使う設計で動的にメモリを確保して使うのであれば、
>インデックスを保持する方法の方が自然な実装だと思います。
僕もそう思います。

この方法で設計してみます。
この方法がやはりベストだと思うので!


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

m_0はいいアイデアだと思いますよ

さらにm_0~m_5を纏めて
CArray<WORD,WORD> m[6]; というのもありかも・・


返信引用
大三元
 大三元
(@大三元)
ゲスト
結合: 18年前
投稿: 54
Topic starter  

>m_0はいいアイデアだと思いますよ
そう思いますか?よかった。
>CArray<WORD,WORD> m[6]; というのもありかも・・
これが一番シンプルですねぇ(^o^)


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

> これに関してそもそもの質問の根源なのですが、
> 検索条件を判定し、m_1~m_5にセットするのですが、
> 判定する元のデータがm_defを直接見るか、
> m_1~m_4でインデックスを取得するかで処理が変わります。
> それをうまく統一できないかな~と思いまして。。

この部分を無理に一つの処理で行おうとするからかえって面倒になるのでは?
検索を行った場合と行わない場合でばっさり処理を分けてしまうのも手でしょうし、
例えば、こんな方法もありだと思います。
(コンパイルは通していないので参考程度に)

メンバー変数に
CArray<WORD,WORD> m_index[5];
としておいて

int countMax;
if(m_KenskuNum == 0)
{
countMax = m_def.GetSize();
}
else
{
countMax = m_index[m_KenskuNum - 1].GetSize();
}

int iIndex;
for(int i = 0; i < countMax; i++)
{
if(m_KenskuNum == 0)
{
iIndex = i;
}
else
{
iIndex = (m_index[m_KenskuNum - 1])[i];
}

// この辺で参照する。
m_def[iIndex]とすれば、参照可能。
}

この辺は設計と言うよりもコーディングのレベルの話ですね。


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

確かにm_0に相当する物があれば、if文はいらなくなりますね。
ただ、この場合は逆にm_KenskuNum==0の場合だけが違う処理なんだということが
わかった方が後から見たと気に直感的にわかっていいような気もします。


返信引用
大三元
 大三元
(@大三元)
ゲスト
結合: 18年前
投稿: 54
Topic starter  

>例えば、こんな方法もありだと思います。
その方法はまずまっさきに思いつきました。
しかし、for文の中でif文で毎回判定するのはよくないかな!?と、思いました。
最大で16000回も判定するもんで・・・

そして、
>int iIndex;
のあとにまずif文で分けてしまい、
それ以下の処理を両方に記述する方法にしようとしました。
しかし、違うのは、iIndexに代入するまでの2行ほどで
以下は同様です。
なので同じ処理を何行も記述するので
無駄かな?美しくないな?と思いまして、
なんかいい方法はないかと質問させていただきました。

その中でm_0の方法を思いつきました。
それならif文が必要なくなります。
メモリは2*16000無駄になりますが・・・


返信引用
大三元
 大三元
(@大三元)
ゲスト
結合: 18年前
投稿: 54
Topic starter  

>確かにm_0に相当する物があれば、if文はいらなくなりますね。
>ただ、この場合は逆にm_KenskuNum==0の場合だけが違う処理なんだということが
>わかった方が後から見たと気に直感的にわかっていいような気もします。
う~ん、それは人によりますね。
判定がいっぱいあったほうが追いづらい人もいるし、
俺は・・・どっちだろう?
まぁ、この場合この0だけ違うというのを忘れることはないと思いますけど。
そう思うならm_0の方法がよいのかな?


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

あうあう。また誤字が。

誤)
わかった方が後から見たと気に直感的にわかっていいような気もします。

正)
わかった方が後から見た時に直感的にわかっていいような気もします。


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

まあ、この辺は個人の好みの範疇でよいのではと思います。
今時のPCであれば、この程度のif文なら足を引っ張るほどにはなら無そうですし。


返信引用
固定ページ 2 / 3

返信する

投稿者名

投稿者メールアドレス

タイトル *

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