PCDVD數位科技討論區

PCDVD數位科技討論區 (https://www.pcdvd.com.tw/index.php)
-   系統組件 (https://www.pcdvd.com.tw/forumdisplay.php?f=19)
-   -   XP 64bit 比32bit 更吃RAM? (https://www.pcdvd.com.tw/showthread.php?t=746638)

冬之炎陽 2007-09-24 05:35 PM

真正佔記憶體多的是 "程式碼" 的空間, 還是資料的空間???
只要修過計算機或是組合語言等等比較低階的都知道
指令的長度會因為系統位元不同而有所不同
過往16bit 在轉 32bit 的時候也有什麼 32bit 程式太站記憶體云云
也確實32bit程式碼部份會變大啦, 包括一些指標和陣列等等都會
但是載入記憶體中的資料本身往往都遠大於程式碼
除非真的去斤斤計較那些記憶體使用量
否則64bit系統是優於32bit系統的

twu2 2007-09-24 07:42 PM

佔空間當然是指資料的部份啊, 就程式碼來說, 64 與 32 所佔用的空間是很接近的. 因為 x86-64 的 operand 跟 x86 一樣, 只會用到 32bits

至於那一種比較好? 就個人看法來說, 排除有特殊需求的情形下, 如果你的系統的記憶體在 4G 以下, 使用 32 會比 64 合適. 如果你的機器裝到了 6G 以上的記憶體, 用 64 會比 32 合適.
等 2G (或以上) 的 RAM 平價化後, 能輕易裝上超過 4G 的記憶體時, x86-64 才會有足夠的優勢把 x86 丟在後頭吧.

superhbin 2007-09-26 11:48 AM

引用:
作者twu2
整數在 64bits 上頭本來就是 32bits 上的一倍.
如果程式裡頭用到的變數有很多是整數或指標, 相同的程式, 在 64bits 上頭, 就會多用近一倍的記憶體.

windows 下 int 還是 4 啦...
特別注意的是 windows 下 long 也還是 4 喔.. 跟 linux 很不一樣..

WinXP 32 WinXP x64
char 1 1
short 2 2
int 4 4
long 4 4
long long 8 8
float 4 4
double 8 8
long double 8 8
pointer 4 8

Linux x86 Linux amd64
char 1 1
short 2 2
int 4 4
long 4 8
long long 8 8
float 4 4
double 8 8
long double 12 16
pointer 4 8

kyrusp 2007-09-26 07:17 PM

哇靠, 如果不知情的把 Linux AMD64 下開發的 GTK+ 程式拿到 WinXP X64 recompile & run, 會不會產生 overflow ? 同樣都是 gcc ?

冬之炎陽 2007-09-26 10:20 PM

引用:
作者kyrusp
哇靠, 如果不知情的把 Linux AMD64 下開發的 GTK+ 程式拿到 WinXP X64 recompile & run, 會不會產生 overflow ? 同樣都是 gcc ?

除非 windows 版 gcc 有作特別處理
否則 overflow 是一定會發生的
我沒試過, 你可以試看看, 再告訴大家 :agree:

superhbin 2007-09-27 03:25 AM

引用:
作者kyrusp
哇靠, 如果不知情的把 Linux AMD64 下開發的 GTK+ 程式拿到 WinXP X64 recompile & run, 會不會產生 overflow ? 同樣都是 gcc ?

是指哪部份可能會 overflow 呢?
不是已經 recompile 了. 我想的到的只有讀到 file data .而 data 讀進來時採用了 long 之類的..在 linux 上佔 8bytes .. windows 上佔 4bytes .
而且直接把 linux 上的這個 file data 拿來 windows 上面用..

kyrusp 2007-09-27 09:29 AM

引用:
作者superhbin
是指哪部份可能會 overflow 呢?
不是已經 recompile 了. 我想的到的只有讀到 file data .而 data 讀進來時採用了 long 之類的..在 linux 上佔 8bytes .. windows 上佔 4bytes .
而且直接把 linux 上的這個 file data 拿來 windows 上面用..


這個嘛....data 到哪邊都是一樣, 我說的是在 memory 中的運作, 想想看, 在 Linux AMD64 下, 一個 long 是 int64, 但是在 WinXP X64 卻是 int32, 從 Linux 底下完全不改移植到 Windows XP X64, 一個不小心就會 overflow 了

拿個比方來說好了, 如果你寫一個加工業的管理系統, 裡面需要算物料的體積, 長寬高, 以 mm 為單位, 你覺得會不會 ? 連正常在寫, 不考慮 Windows or Linux 底下的環境, 長寬高都要用到 int64 了(這樣相乘起來才不會 overflow), 在 Linux AMD64 下很正常就用了 long, 但是移植到 WinXP X64 , 裡面的 long 居然是 int32, 試想, 這樣會不會 overflow ?

superhbin 2007-09-27 09:37 AM

引用:
作者kyrusp
這個嘛....data 到哪邊都是一樣, 我說的是在 memory 中的運作, 想想看, 在 Linux AMD64 下, 一個 long 是 int64, 但是在 WinXP X64 卻是 int32, 從 Linux 底下完全不改移植到 Windows XP X64, 一個不小心就會 overflow 了

拿個比方來說好了, 如果你寫一個加工業的管理系統, 裡面需要算物料的體積, 長寬高, 以 mm 為單位, 你覺得會不會 ? 連正常在寫, 不考慮 Windows or Linux 底下的環境, 長寬高都要用到 int64 了(這樣相乘起來才不會 overflow), 在 Linux AMD64 下很正常就用了 long, 但是移植到 WinXP X64 , 裡面的 long 居然是 int32, 試想, 這樣會不會 overflow ?

了解您的意思了..謝謝.
突然想到 java 怎解決這問題的呢?
看了一下不同平台的 jni_md.h

windows 32bits && 64bits
typedef __int64 jlong;

linux 32bits && 64bits
#ifdef _LP64 /* 64-bit Solaris */
typedef long jlong;
#else
typedef long long jlong;

AIX 32bits && 64bits
typedef int64_t jlong; /*ibm@13822*/

用 define 的方式讓 size(jlong) 都是 8

futureli 2007-09-27 05:27 PM

引用:
作者kyrusp
這個嘛....data 到哪邊都是一樣, 我說的是在 memory 中的運作, 想想看, 在 Linux AMD64 下, 一個 long 是 int64, 但是在 WinXP X64 卻是 int32, 從 Linux 底下完全不改移植到 Windows XP X64, 一個不小心就會 overflow 了

拿個比方來說好了, 如果你寫一個加工業的管理系統, 裡面需要算物料的體積, 長寬高, 以 mm 為單位, 你覺得會不會 ? 連正常在寫, 不考慮 Windows or Linux 底下的環境, 長寬高都要用到 int64 了(這樣相乘起來才不會 overflow), 在 Linux AMD64 下很正常就用了 long, 但是移植到 WinXP X64 , 裡面的 long 居然是 int32, 試想, 這樣會不會 overflow ?


嗯! 這段話其實不完全正確喔...其實在 WinXP x64 和 Linux x64 的 long 一個是4bytes,
一個是 8bytes。關鍵不是在作業系統,而是在編譯器...也就是說...在 WinXP x64 裡用
VC 系列的 x64 編譯器 long 才是 4 bytes, 如果你在 WinXP x64 裡用 x64 的 gcc (
如果你找的到的話^^),那 long 就會是 8 bytes 而不是 4 bytes!

所以如果在 porting 時要是都用 gcc 的話,這問題就不會發生了^^。

superhbin 2007-09-27 05:50 PM

引用:
作者futureli
嗯! 這段話其實不完全正確喔...其實在 WinXP x64 和 Linux x64 的 long 一個是4bytes,
一個是 8bytes。關鍵不是在作業系統,而是在編譯器...也就是說...在 WinXP x64 裡用
VC 系列的 x64 編譯器 long 才是 4 bytes, 如果你在 WinXP x64 裡用 x64 的 gcc (
如果你找的到的話^^),那 long 就會是 8 bytes 而不是 4 bytes!

所以如果在 porting 時要是都用 gcc 的話,這問題就不會發生了^^。

您這種說法是錯的.就算你在 Windows x64 上用 gcc ..
long 一樣是 4 bytes ..
您用 google 查查什麼叫做 LLP , LP ,自己也可以實驗看看就知道了..
---附上一段說明--
64位平臺上的編譯器對int尺寸有3種處理方式
1. ILP : int, long, 和 pointer 都是 64bit。
2. LP : int 是 32bit,long 和 pointer都是 64bit。
3. LLP: int 和 long 都是 32bit,pointer 和 long long 是 64bit。

VC 遵循 LLP 模式。大部分平臺上的GCC都使用 LP 模式,但是Windows平臺上的GCC(MinGW)遵循 VC,使用LLP。
---


所有的時間均為GMT +8。 現在的時間是04:29 AM.

vBulletin Version 3.0.1
powered_by_vbulletin 2025。