![]() |
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)
|
---|
真正佔記憶體多的是 "程式碼" 的空間, 還是資料的空間???
只要修過計算機或是組合語言等等比較低階的都知道 指令的長度會因為系統位元不同而有所不同 過往16bit 在轉 32bit 的時候也有什麼 32bit 程式太站記憶體云云 也確實32bit程式碼部份會變大啦, 包括一些指標和陣列等等都會 但是載入記憶體中的資料本身往往都遠大於程式碼 除非真的去斤斤計較那些記憶體使用量 否則64bit系統是優於32bit系統的 |
佔空間當然是指資料的部份啊, 就程式碼來說, 64 與 32 所佔用的空間是很接近的. 因為 x86-64 的 operand 跟 x86 一樣, 只會用到 32bits
至於那一種比較好? 就個人看法來說, 排除有特殊需求的情形下, 如果你的系統的記憶體在 4G 以下, 使用 32 會比 64 合適. 如果你的機器裝到了 6G 以上的記憶體, 用 64 會比 32 合適. 等 2G (或以上) 的 RAM 平價化後, 能輕易裝上超過 4G 的記憶體時, x86-64 才會有足夠的優勢把 x86 丟在後頭吧. |
引用:
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 |
哇靠, 如果不知情的把 Linux AMD64 下開發的 GTK+ 程式拿到 WinXP X64 recompile & run, 會不會產生 overflow ? 同樣都是 gcc ?
|
引用:
除非 windows 版 gcc 有作特別處理 否則 overflow 是一定會發生的 我沒試過, 你可以試看看, 再告訴大家 :agree: |
引用:
是指哪部份可能會 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 ? |
引用:
了解您的意思了..謝謝. 突然想到 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 |
引用:
嗯! 這段話其實不完全正確喔...其實在 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。