VS2008的32位的程序如何移植到64位的系统,具体操作上的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VS2008的32位的程序如何移植到64位的系统,具体操作上的问题相关的知识,希望对你有一定的参考价值。

我们一个图形处理的程序,需要使用很大的内存读取图像数据,大于4G,因此要将程序移植到64位的系统上,因为64位的系统允许进程调用的内存更大。
因此出现两个问题:
1、64位系统上每个程序最大允许调用多大内存,不用考虑不同系统的差异,因为我们用的是一个server服务器,所以系统理论支持的最大内存是128G,关键问题是每个进程最大的内存调用。
2、32位系统和64位系统在数据类型的长度上有差异,其中包括long型数据和指针pointer型数据长度分别由32位增加到64位,所以在移植系统时需要做一定的修改,希望知道怎么修改的高手能给出具体的操作办法。

另外,我搜集资料时,看到一个兼容的WOW64的办法,不过这个方法只是64位系统的向下兼容,虽然32位程序可以在64位系统下跑,不过却是在一个模拟的32位平台上,内存使用的上上限也不超过4G,所以这个方法对我们没有用。

还有就是32位指针只能指示32位内存,而64位系统的内存有的地方指示不到。是不是内存的每一个地方都需要指针来指示,64位系统内存太多,32位指针不够用,是这个意思吗?
这个地方我之前没弄明白。

希望知道怎么操作的高手能鼎力相助,谢谢了~~还可以加分的,呵呵。
大家都还没有回答一个最重要的问题,就是代码的改变问题。

因为64位中long和指针类型都由原来32位增加到64位长,所以移植的时候代码需要做相关的改变,这一点是目前最困扰我的,我在网上查的资料都只说了类型之间的变化, 但没有说应该做怎样修改,所以希望大家能帮帮忙啊。

打开任务管理器,看下程序的进程,如果进程名后面多了“*”号,则说明该进程是32位的,正运行在WOW64兼容模式下。反之,如果没有星号,则是纯64位程序,可以充分发挥64位的优势。

你那程序是用C++本机代码写的?那就好办了,用Visual Studio 2008打开源程序,针对x64平台改变一下编译配置选项,重新编译一遍就行了。

如果是基于.NET CLR的托管代码,就不存在这个问题了。
.NET设计的初衷就是消除平台差异。
参考技术A 1. 通过页面交换,每一个程序都可以访问指针所能访问的那么大的内存,也就是在32位系统上,可以使用4g内存(指针只能指到4g)

2. 你们的程序内部不会直接就是用 int/long/short之类的去定义数据的吧? 一般都是要用typedef的方式来定义,比如
typedef short INT16;
typedef int INT32;
在程序内部都是用 INT16/INT32这样的东西来定义数据。这样移植的时候只要修改INT16/INT32这些类型声明就可以了。

如果你们的程序全部都是直接使用int/short的,那么可以先把所有的源文件里的 int/short 替换成类似于我前面说的 INT16/INT32之类的定义 (可以用一些工具/脚本来自动替换),然后再移植,只要修改INT16/INT32的定义就OK了。本回答被提问者采纳
参考技术B 找个shovst.exe

64位系统下,一个32位的程序究竟可以申请到多少内存,4GB还是更多

前言:

  • cpu的位是指一次性可处理的数据量是多少,1字节=8位,32位处理器可以一次性处理4个字节的数据量,依次类推。32位操作系统针对的32位的CPU设计。64位操作系统针对的64位的CPU设计。操作系统只是硬件和应用软件中间的一个平台。我们的CPU从原来的8位,16位,到现在的32位和64位。

背景:

电脑的内存是8GB, 装的是32位的Win 7 32位版本,系统认出的内存是3.5GB, 应该说是4GB,因为还有0.5GB内存分配给了显存。

笔者十分痛苦,花重金购置的骇客神条单条8GB竟然被瞬间阉割了4GB。为了物尽其用以及尝鲜系统,又在另外一个分区上安装了Win 8的64位版

  • Win 7(X86)下的内存状况:

  

  • Win 8(X64)下的内存状况:

      

问题:

在满足的看着8G内存全部启用以及体验Win 8 Metro华丽的界面后,脑海里突然飘出一个问题:64位系统下8G内存是否完全能为32位的程序所用。

实验环境:

  • Windows 7 ultimate(x86)
  • Windows 8 Professional(X64)
  • Visual Studio 2010 C++ 编译一个32位程序控制台应用程序
    • 以GB为单位向系统申请内存
    • 以32位方式编译
  • 主函数代码:
    •  1 // CPP_MemoryStudy.cpp : Defines the entry point for the console application. 2 // 3  4 #include "stdafx.h" 5 #include <iostream> 6 using namespace std; 7  8 int _tmain(int argc, _TCHAR* argv[]) 9 {10     int a = 5;11     int MEM_SIZE = 0;12     const int GIGABTYE = 1024*1024*1024*sizeof(char); #1GB 内存13     int *p = NULL;14     cout<<"Please input how many GB memoroy you want allocate:"<<endl;15     cin>>MEM_SIZE;16     p = (int *)malloc(GIGABTYE*MEM_SIZE);17     if(NULL == p)18     {19         cout<<"Allocate Memory Error"<<endl;20     }21     else22     {23         cout<<"Succeed Allocate Memory"<<endl;24     }25     getchar();26     getchar();27     return 0;28 }
  • 程序界面
  • Win 7下运行(测试申请1GB内存 OK
  • Win 8下运行(测试申请1 GB内存 OK
    •    
  • Win 8下运行(单进程测试申请3 GB内存(总内存已 > 4GB) FAIL
    •    
  •  Win 8 下(多32位进程在64位系统下申请内存>4GB OK)-- 这个点子是在和好友讨论的时候想到的,测试了一下竟然可以

结论:

  • 从初步实验结果来看一个32位的程序在64位的环境下不具备使用4GB+内存的能力。
  • 多个32位程序可以申请超过4GB的内存,
  • 还有一个有趣的现象,当我申请内存大于4GB的时候,有的时候会显示内存显示成功,但是资源管理器里面没有更新,证明本质还是没有成功,是保护的原因还是其他的原因还需要深究,这将作为下一章节的题材。
  • 64位系统对于常年运行32位程序的用户的意义只是有可以运行更多地单个32位程序的能力,32位的程序在64位系统下依然不具有寻址4GB+的能力
    • 通俗点说,就是扩大仓库的容量,让其可以放下更多货物

后续研究思路:

  • 将上述程序在64位环境下重新编译,研究内存使用情况
  • 那些号称支持64GB RAM的32位服务器系统,如Windows Server等,就竟单个程序可以使用到多少内存

以上是笔者一些肤浅的理解,尚待更多的研究论证,我会继续跟进这个话题也欢迎您加入这个话题的讨论。

 

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://www.cnblogs.com/captainbed

以上是关于VS2008的32位的程序如何移植到64位的系统,具体操作上的问题的主要内容,如果未能解决你的问题,请参考以下文章

32位机上用vs2008开发的c++程序如何能在64位系统下运行?

sqlite 32位和64位数据库语句识别的区别

visual studio 2008有64位的吗?我win 7 x64系统,怎么装 vs2008

win10vs2015安装文件无法启动

visual studio 2008有64位的吗?我win 7 x64系统,怎么装 vs2008

sqlserver安装程序出现与运行的windows不兼容