對於hp 32bit位 和64bit的區別

 

一,前言<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

  使用64位體系對應用程序的開發者來Solaris 64位操作系32位操作系的最大差在於它使用的C言數據型模型。64位操作系使用LP64模型,在LP64模型中long型和指針類型是64位的。其他基本數據型和32位的模型一32位數據型使用ILP32模型,其中的intlong和指針類型都是32位的。下面列出了64境的主要特點和使用需要考問題l 巨大的虛地址空64境中,一個程可以有多達64的虛地址空,或18 exabytes18*260)。32境中4G地址空的四十倍。由於硬件的限制,有的64位平臺無法完全支持64位的地址空。大地址空使得系可以建更多的程,在32位平臺上一個缺省的程需要1M,在64位平臺上一個缺省的程需要2M。在32位平臺上可以4000個缺省程,在64位平臺上可以8個缺省程。l 使用核心內存的程序由於系核心內部也使用64位的數據構,所以存的程序,如果使用了libkvm/dev/mem/dev/kmem,將無法再在64中運行。必這樣的程序轉變爲64位的程序。l /proc的限制一個使用/proc32用程序可以訪問32程的屬性,但無法訪問一個64程的屬性;存的描述程的接口和數據構不能包含所及的64位的量。這種程序必重新編譯64用程序,這樣才能訪問32位和64程的屬性。l 6432位的用程序必32位的庫鏈接在一起,64位的用程序必64位的庫鏈接在一起。除了過時,所有的都有32位和64位兩版本。但沒有一個64是靜態鏈l 64位運算儘管在32位的Solaris中已64位運算了,但64位的實現爲整數操作和參數傳遞提供了完全64位的機器寄存器。l 大文件如果一個程序只需要支持大文件,使用32Solaris的大文件接口就可以了。但是了充分的利用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

圖解如下:

 

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

pp,qq,ll

Adress

 data

0x200000007ffff650

00

0x200000007ffff651

00

0x200000007ffff652

00

0x200000007ffff653

01

0x200000007ffff654

l

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但在裏我看到,c1c2都被分配了4個字的存,在32bit機下,在爲變/象分配內存的候,是以4節對齊,無你的型是什。也就是,任何一個/象的存都是以4的整數倍的地址始的。64bit機下,都是8的倍數。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章