對於hp32bit位和64bit的區別
一,前言
使用64位體系結構對應用程式的開發者來說,Solaris 64位作業系統和32位作業系統之間的最大差別在於它們使用的C語言資料型別模型。64位作業系統使用LP64模型,在LP64模型中long型別和指標型別是64位的。其他基本資料型別和32位的模型一樣。32位資料型別使用ILP32模型,其中的int,long和指標型別都是32位的。下面列出了64位環境的主要特點和使用時需要考慮的問題。l 巨大的虛擬地址空間在64位環境中,一個程式可以有多達64位寬的虛擬地址空間,或18
exabytes(18*260位元組)。這是32位環境中4G虛擬地址空間的四十億倍。由於硬體的限制,有的64位平臺無法完全支援64位的地址空間。大地址空間使得系統可以建立更多的執行緒,在32位平臺上一個預設的執行緒需要1M堆疊,在64位平臺上一個預設的執行緒需要2M堆疊。在32位平臺上可以建立4000個預設執行緒,在64位平臺上可以建立8萬億個預設執行緒。l 使用核心記憶體的程式由於系統核心內部也使用64位的資料結構,所以現存的程式,如果使用了libkvm,/dev/mem或/dev/kmem,將無法再在64位環境中執行。必須將這樣的程式轉變為64位的程式。l
/proc的限制一個使用/proc的32位應用程式可以訪問32位程式的屬性,但無法訪問一個64位程式的屬性;現存的描述程式的介面和資料結構不能包含所涉及的64位的量。這種程式必須重新編譯成64位應用程式,這樣才能訪問32位和64位程式的屬性。l 64位庫32位的應用程式必須和32位的庫連結在一起,64位的應用程式必須和64位的庫連結在一起。除了過時的庫,所有的庫都有32位和64位兩種版本。但沒有一個64位庫是靜態連結庫。l 64位運算儘管在32位的Solaris系統中已經有64位運算了,但64位的實現為整數操作和引數傳遞提供了完全64位的機器暫存器。l
大檔案如果一個程式只需要支援大檔案,使用32位Solaris的大檔案介面就可以了。但是為了充分的利用64位的優點,最好把程式轉變為64位程式碼。
64 位計算
Red Hat 和很多其它發行商為 Compaq/DEC Alpha 提供了一種 64 位版的 Linux。您可以在 AlphaLinux Web 站點上了解關於這種 Linux 的其它資訊。64 位的 Solaris 和 64 位的 Linux/Alpha 都使用 LP64 資料模型,它能夠帶來很好的相容性。
不久,Intel Itanium(TM) IA-64 處理器也能使用一種 64 位版的 Linux。您可以在 IA-64 Linux Project Web 站點了解關於這種 Linux 的更多資訊。一種支援 IBM 64 位 PowerPC 體系結構的 Linux 也在開發之中。
請注意,儘管 SuSE Linux/UltraSPARC 的核心執行在 64 位的模式中,但 SuSE Linux/UltraSPARC 目前並不支援 64 位的使用者空間應用程式。
二,對於hp 32bit位 和64bit的區別
hp C/HP-UX 32-bit and 64-bit base data types |
||
data type |
ILP32 size (bits) |
LP64 size (bits) |
char |
8 |
8 |
short |
16 |
16 |
int |
32 |
32 |
long |
32 |
64 |
long long(1) |
64 |
64 |
pointer |
32 |
64 |
float |
32 |
32 |
double |
64 |
64 |
long double |
128 |
128 |
enum(2) |
32 |
32 |
最主要的區別是long型和pointer型資料。
三,32bit機資料在內容中的說明
A)
在為變量/對象分配記憶體的時候,總是以4字節對齊,無論你的變數類型是什麼。也就是說,任何一個變數/對象的存儲空間都是以4的整數倍的地址開始的。
B)
對於pointer型資料,因為內容是地址,要求該地址也必須是4整數倍。
C)
例如:
main()
{
struct student
{
int i;
long l;
}node;
struct student *p;
p=&node;
int *pp;
char *qq;
long *ll;
p->i=1;
p->l=2;
pp=(int *)p;
qq=(char *)p;
ll=(long *)p;
printf(“int pp l=%d/n”,*(pp+1)); /*result =2*/
printf(“char qq l=%d/n”,*(qq+7)); /*result =2*/
(char型指標指向的內容只能是1位元組的資料。如果將
p->l賦更大的值22222,*(qq+7))只能取到地址為0x200000007ffff657
對應的內容)
printf(“long ll l=%d/n”,*(ll+1)); /*result =2*/
}
結構體的記憶體分配如下:
0x200000007ffff650: 0x00000001 0x00000002 0x00000000 0x00000000
0x200000007ffff660: 0x00000190 0x000002ec 0x000017a0 0x00000002
0x200000007ffff670: 0x00000000 0x00000000
圖解如下:
Adress |
data |
|
0x200000007ffff650 |
00 |
|
0x200000007ffff651 |
00 |
|
0x200000007ffff652 |
00 |
|
0x200000007ffff653 |
01 |
|
0x200000007ffff654 |
00 |
|
0x200000007ffff655 |
00 |
|
0x200000007ffff656 |
00 |
|
0x200000007ffff657 |
02 |
|
0x200000007ffff658 |
|
|
0x200000007ffff659 |
|
|
0x200000007ffff65A |
|
i |
四,64bit機資料在內容中的說明
A)
在為變量/對象分配記憶體的時候,總是以8字節對齊,無論你的變數類型是什麼。也就是說,任何一個變數/對象的存儲空間都是以8的整數倍的地址開始的。
B)
對於pointer型資料,因為內容是地址,要求該地址也必須是8整數倍。
C)
例如:
main()
{
struct student
{
int i; /*8個位元組的儲存空間,*/
long l; /*8個位元組的儲存空間,*/
}node;
struct student *p;
p=&node;
int *pp;
char *qq;
long *ll;
p->i=1;
p->l=222222222;
pp=(int *)p;
qq=(char *)p;
ll=(long *)p;
printf(“int pp l=%d/n”,*(pp+2));/*result int pp l=222222222*/
printf(“char qq l=%d/n”,*(qq+15));/*result int pp 13*/
printf(“long ll l=%d/n”,*(ll+1));/*result int pp l=222222222*/
}
五,64bit機下,記憶體對齊的例子
正確:
int main()
{
long i;
char a[44];
long *p;
p=(char *)(a+8);
*p=3;
printf(“*p=%d/n”,*p); /*result = 3*/
}
錯誤:
void main()
{
long i;
char a[44];
long *p;
p=a+4;
*p=3;
printf(“*p=%d/n”,*p); /*bus error*/
}
六,程式中的記憶體分配淺談
一.存空間的對齊規則
首先看一段例子:
……
int i1;
char c1;
char c2;
int i2;
cout << “i1:” <<&i1 << “/n”;
cout << “c1:” <<(void *)&c1 << “/n”;
cout << “c2:” <<(void *)&c2 << “/n”;
cout << “i2:” <<&i2 << “/n”;
……
輸出結果如下:
i1:0012FF4C
c1:0012FF48
c2:0012FF44
i2:0012FF40
是不是有些奇怪?
我們知道char型別的變數是隻佔用一個位元組的,用sizeof(char)得到的結果也會是1。但在這裡我們看到,c1和c2都被分配了4個位元組的儲存空間,在32bit機下,在為變數/物件分配記憶體的時候,總是以4位元組對齊,無論你的變數型別是什麼。也就是說,任何一個變數/物件的儲存空間都是以4的整數倍的地址開始的。64bit機下,都是8的倍數。
相關文章
- 對於java中的"\"和"/" 區別Java
- 溢位OF和進位CF區別
- 取反!和按位取反~的區別
- 關於mysql設定varchar 欄位的預設值''和null的區別,以及varchar和char的區別MySqlNull
- !和~的區別(邏輯取反和按位取反)
- 關於Ae和Pr的的區別,你瞭解對了嗎?
- 電位器和編碼器的區別
- 關於HashMap和Hashtable的區別HashMap
- python32位和64位的區別是什麼Python
- 關於mysql中欄位定義的型別int、tinyint區別MySql型別
- select * 和 select 所有欄位的區別
- LOB欄位EMPTY_LOB和NULL的區別Null
- C#中的屬性和欄位的區別C#
- 絕對路徑和相對路徑的區別,
- 絕對路徑和相對路徑的區別
- 關於gcc、make和CMake的區別GC
- 【對線面試官】CountDownLatch和CyclicBarrier的區別面試CountDownLatch
- 對比git rm和rm的使用區別Git
- SOAP和RESTful框架的簡介、對比和區別REST框架
- 關於stable_sort()和sort()的區別:
- 關於java的引用和c++的區別JavaC++
- windows7電腦系統32位和64位區別Windows
- 全面對比 Redis 和 Memcached 的 6 點區別Redis
- 範圍分割槽表和INTERVAL分割槽表對於SPLIT分割槽的區別
- ../和./和/的區別
- 和 的區別
- as 和 with的區別
- ||和??的區別
- /*和/**的區別
- 遞增、遞減運算子位於變數前後的區別變數
- Python32位和64位有何區別?如何檢視?Python
- 集計時對於溢位的捕獲和處理
- 關於Java和C#的型別對比JavaC#型別
- LinkedList和ArrayList的區別、Vector和ArrayList的區別
- http和https的區別/get和post的區別HTTP
- 1-相對定位、絕對定位和固定定位的區別
- 關於Ajax和websocket的區別以及使用場景!Web
- 關於記憶體中棧和堆的區別記憶體