unknown
2009-07-30 06:23:01 UTC
上田です。
malloc関数でソートに使うメモリーを確保しています。
そこで前々から気になっていることがあります。
MSDOSで64Kバイトを越える大量のメモリーを運用する場合は
64Kの境界に注意することを警告されていました。
これは16ビットではアドレスがセグメントとオフセットに別れており、
オフセットが0x0000から0xffffまでとなっているためだそうです。
ソートではメモリーの交換を行ないますが、境界を含む部分を交換は
できないことになるから、必ず交換の単位は例えば8バイトのように
割り切れる数値でないと異常を来たすので要注意することと。
それではWindowsの場合はどうなるのでしょう。確か32ビットだから
そんな事は気にしないでも大丈夫なんでしょうか。VC6ではhugeポインタの
項目が無いこと、halloc関数がなく、mallocしかないことを考えれば
そんな事(64K境界の問題)は考えなくて良いのでしょうか。
しかし、nearとfarの記述は載っています。使えると言うことは
アドレスの考え方は同じなのでしょうか。そもそも、このアドレスの考え方は
インテルCPUだけで、AMDのCPUではセグメントとオフセットの
考え方ではなかったように記憶しているのですが。
つまり、MSDOS時代ではCPUメーカーによって対応が異なっていたと
思うのですが。
malloc関数でソートに使うメモリーを確保しています。
そこで前々から気になっていることがあります。
MSDOSで64Kバイトを越える大量のメモリーを運用する場合は
64Kの境界に注意することを警告されていました。
これは16ビットではアドレスがセグメントとオフセットに別れており、
オフセットが0x0000から0xffffまでとなっているためだそうです。
ソートではメモリーの交換を行ないますが、境界を含む部分を交換は
できないことになるから、必ず交換の単位は例えば8バイトのように
割り切れる数値でないと異常を来たすので要注意することと。
それではWindowsの場合はどうなるのでしょう。確か32ビットだから
そんな事は気にしないでも大丈夫なんでしょうか。VC6ではhugeポインタの
項目が無いこと、halloc関数がなく、mallocしかないことを考えれば
そんな事(64K境界の問題)は考えなくて良いのでしょうか。
しかし、nearとfarの記述は載っています。使えると言うことは
アドレスの考え方は同じなのでしょうか。そもそも、このアドレスの考え方は
インテルCPUだけで、AMDのCPUではセグメントとオフセットの
考え方ではなかったように記憶しているのですが。
つまり、MSDOS時代ではCPUメーカーによって対応が異なっていたと
思うのですが。