大きな配列を渡そうとする場合 – 固定ページ 2 – プログラミング – Home

大きな配列を渡そうとする場合
 
通知
すべてクリア

[解決済] 大きな配列を渡そうとする場合

固定ページ 2 / 2

アイススケーター
 アイススケーター
(@アイススケーター)
ゲスト
結合: 23年前
投稿: 280
 

ちなみに私のマシンは
 メモリ 192MB
 Windows2000
ですが
200MBのエリアを試しに確保しましたが、数分かかりました。
この間、ハードディスクのアクセスランプがつきっぱなしでした。
もう二度とこんなことはしないぞ。


返信引用
アイススケーター
 アイススケーター
(@アイススケーター)
ゲスト
結合: 23年前
投稿: 280
 

追伸

先ほどのテスト後、マシンのレスポンスが遅くなりました。
このため、再立ち上げを行いました。

よい子のみんなはマネしないように。


返信引用
kazuma
 kazuma
(@kazuma)
ゲスト
結合: 24年前
投稿: 217
 

> アプリは画像・音声一杯あります。

当面必要なものだけメモリ上に置いておいて、
残りはファイルなどに置いておくといった工夫をするのが普通だと思いますが。


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

勉強不足ですみません。

>この値は、mallocには5GBではなく1GBとして渡されます。
>5GBを0xffffffffでANDしてみると解ります

>5GBは0x140000000ですがこれに0xffffffffをANDすると
>0x040000000(1GB)となります。

なんでUNSIGNED INTの時は
0xffffffffでANDしないと
いけないのでしょうか?


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

>この値は、0xf000000000(960GB)ですがこれに0xffffffffをANDすると
>0x0000000000(0バイト)となります。
>このため、こちらは正常応答となっています。

正常応答と言っても、
エリアとしては確保できていないのですね。
ここでは


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 24年前
投稿: 252
 

> なんでUNSIGNED INTの時は
> 0xffffffffでANDしないと
> いけないのでしょうか?

うんにゃ。単純にオーバーフローしているだけの話。

変数に格納されるのは,オーバーフローして0xFFFFFFFFとの論理積になるということを,
アイススケーターさんは言いたいのだと思います。

次のプログラムを実行してみてください。

#include <stdio.h>

int main (void)
{
size_t size = 100 * 256 * 256 * 200 * sizeof(int);
printf(%x\n, size);
return 0;
}

Tjさんが予期しているはずの138800000ではなく,38800000が表示されるはずです。


返信引用
アイススケーター
 アイススケーター
(@アイススケーター)
ゲスト
結合: 23年前
投稿: 280
 

YuOさん代弁ありがとうございました。

データの範囲はWindowsの場合は

char - 0x80 ~ 0x7f
BYTE 0 ~ 0xff
short - 0x8000 ~  0x7fff
WORD 0 ~ 0xffff
int(long) -0x8000000 ~ 0x7fffffff
unsigned int 0 ~ 0xffffffff
     ※int は別システムではshortと同じ範囲となる場合もある。

です。
計算値がオーバーフローすると計算結果でオーバーフローした上位分を切り捨てます。

↓YuOさんが書いてくださった分
>#include <stdio.h>

>int main (void)
>{
> size_t size = 100 * 256 * 256 * 200 * sizeof(int);
> printf(%x\n, size);
> return 0;
>}

>Tjさんが予期しているはずの138800000ではなく,38800000が表示されるはずです。

100 * 256 * 256 * 200 * sizeof(int) -> 0x138800000
~--------
↑の~部分がオーバーフローした上位分です。
C言語は、オーバーフローした分をエラーとして返さないためプログラマはこれを意識
してプログラムする必要があります。
アセンブラならオーバーフローしたときにフラグが立つのですが、ここでは関係ないので
あまり触れないようにします。

ここまで書いて、解らない場合は、もうめんどうみきれません。

さようなら


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

なるほど。
よくわかりました。

変数がふくらんだので、今後は
かなりの分、
ファイルをFOPENしてFPUTしていこうと思います。


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

解決です。


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

返信する

投稿者名

投稿者メールアドレス

タイトル *

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