32bit与64bit程序(2)比较
32bit与64bit程序(2)⽐较
32 bit  与 64 bit 程序(2)区别
  由于操作系统内存分配的不同,导致软件开发过程中,需要编译不同版本的软件。
⼏个重要概念:
(1)这⾥所说的的32位与64位程序,是指经过编译器编译后的可执⾏⽂件,例如像Windows上的exe⽂件,⽽最初编写的源码并没有32位和64位之说。
(2)不是所有的程序需要区分32位和64位,对于原⽣语⾔例如C语⾔编写的程序需要区分64位与32位,但是对于像Java这样的语⾔,就不需要这样了,因为Java编写的程序是在JVM(Java虚拟机)上运⾏的,JVM屏蔽了具体的硬件细节。
(3)32位与64位的程序的本质区别在于:两者最终在处理器CPU上运⾏的指令是不⼀样的
  平台的所指的是:CPU +OS + 软件
  软件:【源码】 + 编译器【64/32】= exe【64/32】
⼀、处理器CPU的不同(64bit, 32bit):
  主要是指:64位CPU,32位CPU,对于历史中的16bit的处理器,则不是当今主流不讲。
  注意:CPU的不同bit ,内部的指令集,操作位数,寄存器名称和个数都不同。
⼀、⽐如⼀条mov eax,1指令,可能在32bCPU上对应的机器指令是0x1201;在64位机器上就是0x123401。
⼆、64位CPU⾥的寄存器是64位的,这样CPU每次处理的数据量也就更⼤,32位CPU寄存器是32位的。
三、64位CPU⾥的寄存器数量也多于32位CPU。
四、32位CPU的地址总线不⼀定是32位的,还有可能是48位的,同样64位的CPU地址总线也不⼀定是64位,往往都是48位。
五、现在对于主流的处理器,64位的CPU是能够兼容32位指令架构的
(1)从上⾯可以看到64位CPU的运算能⼒理论上⽐32位CPU强很多。
(2)现在32位的CPU⼀般是X86架构的,从80386开始就是32位的CPU,也对应他的32位指令集。
(3)后来发展出64位CPU,从X86扩展出64位的指令集,⼀般我们就叫做X64,也叫AMD64架构,因为最早是AMD推出64位CPU的。
⼆、操作系统OS(64bit, 32bit):
1. OS与CPU的关系
抖音vlog怎么拍
(1)32位的操作系统是专门为32位CPU设计的,同样64位的操作系统是为64位的CPU设计的。
(2)前⾯也说了,64位的CPU能够兼容32位指令架构,因此在64位CPU上也可以安装32位操作系统。
(3)32bit的操作系统安装再32bit CPU, 64bit 的OS安装再64bit CPU才能将OS发挥最⼤优势。
(4)32bit的编译器也可以编译64bit 的程序。
2. 寻址空间的影响
  64bit CPU拥有更⼤的寻址能⼒,使⽤最⼤为192GB内存,⽽32bit只⽀持4G内存.
  64位CPU⼀次可提取64位数据,⽐32位提⾼了⼀倍,理论上性能会提升1倍。但这是建⽴在64bit操作系统,64bit软件的基础上的。
  之所以叫做“64位处理器”,是因为电脑内部都是实⾏2进制运算,处理器(CPU)⼀次处理数据的能⼒也是2的倍数。8位处理器、16位处理器、32位处理器和64位处理器,其计数都是2的倍数。⼀次处理的数据越⼤,该电脑处理信息的能⼒越来越⼤;因此64位处理在先天就⽐32位处理器具有快速的能⼒。那为什么不⽤更⾼级的128位处理器呢?因为位数越⾼,处理器芯⽚的设计也就越复杂,⽬前的技术⽔平暂时⽆法制造这么复杂的芯⽚。
3. 程序软件【32bit, 64bit】
1公顷等于多少平方米?(1)32位的程序就是将源码⽤32位的编译器编译的,64位的程序就是将源码⽤64位的编译器编译的。
(2)应⽤程序只接触逻辑地址,并不接触真实的物理地址。
  32位的程序理论上可以申请利⽤4GB的地址空间,64位的程序则可以申请利⽤⼤于4GB 的地址空间,这也是64位程序的⼀个巨⼤优势。
  我们知道应⽤程序的运⾏是需要操作系统作为⽀撑的,这些程序在运⾏时常常需要进⾏⼀些系统调
⽤,还有各种库函数等。
这些可执⾏⽂件【exe】能否顺利运⾏有着两个最重要的地⽅。
1)动态链接库。
2)系统API。
  对于Windows系统⽽⾔,64位的系统往往还具有32位系统的库,因此在64位系统上能够运⾏32位的程序,但是反过来就不⾏了,因为32位系统⼀般没有64位系统的库。
  再64bit 的 Window系统中,32bit 的exe 调⽤的是⽬录下的系统dll:C:\ Window\SysWOW64\....,这⾥的
SysWOW64,表⽰的意思是: 32bit 的软件在Window 64 位OS上运⾏的32bit 的dll 系统⽂件。
  64bit 的exe则调⽤的⽬录的系统dll: c:、Window\Win32\...
  注意:这⾥的Win32可能是历史遗留问题,这样对于Window 64 的改动较⼩,我猜测的,哈哈哈
  64exe 调⽤的64bit OS的系统dll⽂件
64bit 处理器优势:
(1)硬件,执⾏速度更快,更⼤的内存管理。
(2)软件,最新的尖端软件⾸选64bit 操作系统作为开发平台。
科兴第二针必须28天么64bit处理器劣势:
(1)硬件,部分的驱动程序对64bit 的系统⽀持不⾼,例如对于⼯业控制领域,更多的模块提供了32bit 的控制库⽂件,⽽没有64bit的版本。
(2)软件,由于操作系统是64bit 的,导致很多历史中的32bit 的exe 不能再64系统上兼容,可能出现计算误差。
2. 代码中的基本的数据类型,会根据操作系统的位数分配内存⼤⼩:
  因此在64位上对int型数据操作,编译⽣成32的程序,有可能导致int型越界,软件出现问题
不同的平台上对不同数据类型分配的字节数是不同的,数据类型的字节数应该是由CPU决定的,但是实际上主要由编译器决定(占多少位由编译器在编译期间说了算)。
嚷的多音字组词常⽤数据类型对应字节数:
 可⽤如sizeof(char),sizeof(char*)等得出
  测试程序:
#include "stdafx.h"
#include <iostream>
#include <string>
碘化银人工降雨using namespace std;
//main
int _tmain(int argc, _TCHAR* argv[])
{
cout << "sizeof(char):" << sizeof(char) << endl;
cout << "sizeof(short):" << sizeof(short) << endl;
cout << "sizeof(int):" << sizeof(int) << endl;
cout << "sizeof(long):" << sizeof(long) << endl;
cout << "sizeof(long long):" << sizeof(long long) << endl;
cout << "sizeof(unsigned int):" << sizeof(unsigned int) << endl;
cout << "sizeof(float):" << sizeof(float) << endl;
cout << "sizeof(double):" << sizeof(double) << endl;
void* pointer;
cout << "sizeof(pointer):" << sizeof(pointer) << endl;
system("pause");
return0;
}
  32bit 的编译器下测试输出:数据类型长度
  64 bit 的编译器下测试输出:数据类型长度
注意:
(1)32位和64位系统在Windows下基本数据类型的⼤⼩都是⼀样的。只有指针的⼤⼩不⼀样!32位指针⼤⼩为4byte,⽽64位的指针⼤⼩为8byte。
(2) Linux下,long型是64位的,这⼀点是和Windows不同的地⽅。
  为什么Windowsx64下long也为4byte?
  正常标准的话,long应该也是64位即8byte。但是在Windows下,我们的结果却是4byte。为什么会这样呢?
因为:
  我们编程时很少关注数据类型真正的⼤⼩,毕竟即使不关注这个也可以编程,⽽且我们习惯了Win32,
到64位下,只有指针因为寻址需要是必须变成64位的,64位的指针寻址范围是0~2^64-1,⽽其他的数据类型基本已经够⽤,如果把所有数据类型变成64位,明显是浪费空间。再者,为了让32位和64位程序兼容运⾏,能少修改还是少修改,所以Windows仅将指针⼤⼩进⾏了修改。这样,程序可以兼容运⾏。
 指针的⼤⼩⽐较?
  int类型指针,通⽤指针void*,类指针,函数指针的长度确定:
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
class Test
{
int num;
string name;
};
//⼀个函数指针
typedef void(*pFunc)(void);
void PrintHello(void)
{
cout << "hello world" << endl;
}
//main
int _tmain(int argc, _TCHAR* argv[])
{
int* pInt;
void* pVoid;
Test* pTest = new Test();
pFunc pfunc = PrintHello;
cout << "sizeof(pInt):" << sizeof(pInt) << endl;
cout << "sizeof(pVoid):" << sizeof(pVoid) << endl;
cout << "sizeof(pTest):" << sizeof(pTest) << endl;
cout << "sizeof(pFunc):" << sizeof(pfunc) << endl;
system("pause");
return0;
}
结果:
Win32下:
sizeof(pInt):4
sizeof(pVoid):4
sizeof(pTest):4
sizeof(pFunc):4
土族人连连看请按任意键继续. . .
x64下:
sizeof(pInt):8
sizeof(pVoid):8
sizeof(pTest):8
sizeof(pFunc):8
请按任意键继续. . .
  不管指针指向张三李四还是王⼆⿇⼦,都是⼀样⼤的。能够影响指针⼤⼩的,还是位数。32位下指针⼤⼩为4,64位下指针的⼤⼩为8.
总结:
(1)32位升级到64位不是简单的重新编译发布⼀下就可以了。举个例⼦,在32位C语⾔环境⾥⼀个指针可以放⼊⼀个int型的变量中,但在64位⾥就不⾏了了,因为64位程序⾥的指针为64位,这样的话程序肯定就爆了,因此对于某些程序如果想要升级到64位,则需要修改源码,这个⼯作是相当繁琐的。
(2)由于64位操作系统的寻址和偏移的问题,也有可能导致程序在运⾏过程中,计算结果与32位系统不⼀致
(3)64位CPU可以运⾏32位或者64位的操作系统,64位操作系统可以运⾏32位或64位程序。
(4)32位CPU只能安装32位的操作系统,⽽32位操作系统只能运⾏32位的程序。
(5),第⼀个64位的程序是怎么来的,因为那个时候还没有64位的编译器,其实很简单,32位的编译器也可以编译出64位的程序,当然这个问题就没有必要深究了
endl;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。