32位到64位的移植
32位MS SQL Server快速迁移到64位的方法
32位MS SQL Server快速迁移到64位的方法随着科技的发展,64位服务器在企业应用中日益普及。
因此可能会碰到把32位SqlServer数据库迁移到64位SqlServer数据库服务器上。
最传统的方法是:1、在64位服务器上安装64位操作系统Windows2003,安装64位的SqlServer2000;2、Dump所有帐套的数据库;3、将数据库文件从32位服务器上拷贝到64位的服务器上;4、Load所有帐套的数据库;5、处理所有帐套的用户登录以及密码问题。
往往很多企业的数据库非常大,可能好几G,而且可能有好几个帐套,因此执行第2步、第4步的时间往往会耗用6、7小时,甚至10多个小时。
而且Load帐套后,用户会丢失。
虽然MSDN上面有能将用户、密码恢复的方法,但是操作非常麻烦。
那么有没有比较简单快速的方法呢?首先,我们分析一下SqlServer的结构。
1、在数据库服务器的注册表里记录着Master所在位置。
运行注册表编辑器Regedit.exe,选择查找功能,查找内容为master.mdf,可以查到master.mdf的信息。
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\Parameters]"SQLArg0"="-dd:\\Program Files\\Microsoft SQL Server\\MSSQL\\data\\master.mdf""SQLArg1"="-ed:\\Program Files\\Microsoft SQL Server\\MSSQL\\log\\ERRORLOG""SQLArg2"="-ld:\\Program Files\\Microsoft SQL Server\\MSSQL\\data\\mastlog.ldf"2、用户登录信息以及密码存储在Master数据库。
Linux程序从32位向64位移植参考资料
随着64 位体系结构的普及,针对64 位系统准备好您的Linux® 软件已经变得比以前更为重要。
在本文中,您将学习如何在进行语句声明、赋值、位移、类型转换、字符串格式化以及更多操作时,防止出现可移植性缺陷。
Linux 是可以使用64 位处理器的跨平台操作系统之一,现在64 位的系统在服务器和桌面端都已经非常常见了。
很多开发人员现在都面临着需要将自己的应用程序从32 位环境移植到64 位环境中。
随着Intel® Itanium® 和其他64 位处理器的引入,使软件针对64 位环境做好准备变得日益重要了。
与UNIX® 和其他类UNIX 操作系统一样,Linux 使用了LP64 标准,其中指针和长整数都是64 位的,而普通的整数则依然是32 位的。
尽管有些高级语言并不会受到这种类型大小不同的影响,但是另外一些语言(例如 C 语言)却的确会受到这种影响。
将应用程序从32 位系统移植到64 位系统上的工作可能会非常简单,也可能会非常困难,这取决于这些应用程序是如何编写和维护的。
很多琐碎的问题都可能导致产生问题,即使在一个编写得非常好的高度可移植的应用程序中也是如此,因此本文将对这些问题进行归纳总结,并给出解决这些问题的一些方法建议。
64 位的优点32 位平台有很多限制,这些限制正在阻碍大型应用程序(例如数据库)开发人员的工作进展,尤其对那些希望充分利用计算机硬件优点的开发人员来说更是如此。
科学计算通常要依赖于浮点计算,而有些应用程序(例如金融计算)则需要一个比较狭窄的数字范围,但是却要求更高的精度,其精度高于浮点数所提供的精度。
64 位数学运算提供了这种更高精度的定点数学计算,同时还提供了足够的数字范围。
现在在计算机业界中有很多关于32位地址空间所表示的地址空间的讨论。
32 位指针只能寻址4GB 的虚拟地址空间。
我们可以克服这种限制,但是应用程序开发就变得非常复杂了,其性能也会显著降低。
32位系统换64位教程
32位系统换64位教程在计算机世界中,32位系统和64位系统是两种常见的操作系统架构。
尽管32位系统在过去被广泛使用,但随着计算机技术的快速发展,许多用户将其视为过时的选择,转而选择更强大和高效的64位系统。
如果你是一位32位系统用户,并且想要迈向更强大的64位系统,下面是一个简单的教程帮助你完成系统升级。
第一步是检查你的计算机是否支持64位系统。
大多数现代计算机都是兼容64位系统的,但是为了确保你的计算机适用于64位系统,你可以打开“我的电脑”或“计算机”,右键点击“属性”,然后查看“计算机类型”一栏。
如果你的计算机是 32位操作系统,则更新到64位系统将不可行。
第二步是备份你的数据。
在系统升级过程中,数据的丢失是一种常见的风险,因此在进行任何操作之前,最好备份你的重要文件和文件夹。
你可以使用外部硬盘、云存储或其他可用的备份方法来保存你的数据。
第三步是选择合适的64位操作系统镜像。
根据你的需求和偏好,选择一个适合你的64位操作系统版本。
常见的操作系统如Windows、macOS、Linux都有64位版本可供选择。
你可以从官方网站下载适合你需求的64位操作系统镜像。
确保下载的镜像文件是安全可靠的,最好是从官方渠道下载。
第四步是制作一个启动盘。
一旦你获得了64位操作系统的镜像文件,你需要制作一个启动盘以进行安装。
你可以使用一些第三方工具(如Rufus)将镜像文件写入一个可启动的USB闪存驱动器或DVD光盘。
确保在制作启动盘之前,你已经备份了启动盘中的所有数据。
第五步是启动计算机并安装64位操作系统。
插入制作好的启动盘并重启计算机。
在启动过程中,你需要按下相应的按键(通常是F2、F12或Delete键)进入BIOS设置界面。
在BIOS设置中,将启动选项更改为UEFI或Legacy模式,以便计算机能够从启动盘启动。
保存设置并退出BIOS。
随后,按照屏幕上的指示完成操作系统的安装过程。
第六步是恢复你的数据。
32位程序移植到64位平台前的准备工作
32位程序移植到64位平台前的准备工作我们最近完成的一个项目是移植一个大型的32位应用程序,它可在64位环境中支持11个操作系统平台,并且程序的源代码超过了30万行。
由于此32位程序是在几年前分成几部分开发而成,所以极有可能代码是由不同的开发者编写。
鉴于此,我们有理由怀疑,在64位移植中导致问题的类型不匹配,很有可能是在这几年中随着程序模块的添加与删除而引入的。
我们移植此32位程序到64位平台,是为了利用64位技术的先进之处--支持更大的文件、支持更大的内存、及64位计算,大体使用的方法是一个反复迭代的过程,不断地在一些细节问题上来来回回,如字节序、调整编译器选项等等,并时不时停下来查看是否达到了总体目标--遵从ANSI标准及源代码将来的可移植性。
第一步,我们研究了64位的系统资源,以充分了解11个操作系统平台上每一个的编译器选项、内存模型和编码方面的考虑。
作为全部工作的起点,我们在其中一个平台上打开了所有编译器警告,进行第一次构建,并仔细检查构建日志信息。
通过这些最初的构建、使用本地调试器、及之后使用如Parasoft''s Insure++(/)这样的工具,我们确定了一个开发蓝图,接下来,编制了一个清晰彻底的源代码目录清单,并在每次配置构建之后进行相应的检查。
经过最初的代码修改、调试、查阅构建日志,已经有足够的信息对现实中可能碰到的事件进行排序以确定优先次序。
在一个拥有所有基本功能的程序成功地通过我们的自动测试案例之后,移植工作总算到了一个转折点;此测试除了测试64位功能,也包含了向后兼容性测试。
如果你所移植的项目中有几个不同的64位平台,很可能要在其上一一测试,一旦程序可在第一个平台上正确运行,接下来就要测试下一个平台,如此这般下去。
然而,我们却发现了一个非常好的方法,可在同一时间,在所有的平台上进行工作,这是因为:·每一个编译器都在它的警告信息中都提供了不同的信息,仔细查看几个编译器产生的错误,可有助于我们定位问题区域。
从32位应用程序到64位应用程序
从32位应用程序到64位应用程序编译:starlight原文porting 32-bit to 64-bit on Xeon这篇文章主要是讲述如何将已有的32位程序编译成为64位程序, 并简单讲述如何远程调试64位应用程序, 以及在其中可能遇到的问题, 其中译注补充部分为自已的实践经验, 如有出入或其它解决方案, 欢迎指正.本文一步一步地描述了怎样使用Microsoft Visual Studio IDE创建64位应用程序, 并且,64位的应用程序代码和32位应用程序代码完全一样, 只是编译环境配置有所不同。
目前还没有发现有纯64位的IDE应用程序开发环境。
笔者翻译本文时,Microsoft已在2002/2003/2005/2008 IDE中提供了64位创建环境,但完全的64位IDE开发环境似乎还没有。
有兴趣的朋友可以看下:/deeptanshuv/archive/2006/04/11/573795.aspx/en-US/netfx64bit/threads/当前的软件开发包(应该是指Microsoft SDK 2003 server RC2)包括了专为64位应用程序开发的编译器,链接器, 和其它的工具. 同样, 这个SDK包含了C运行时库(CRT), 微软基础类库(MFC), 和活动模板库(ATL), 这些均是64位的产品版本. 你可以用Visual C++ 6.0 或者Visual C++ .NET IDE创建64位的应用程序。
如果你有一个32位的应用程序并且你想移植它到64位应用程序, 这篇文章描述了怎样在同一个工程中创建一个64位的配置环境。
一些必要条件这下面的列表描述了推荐的硬件, 软件, 网络以及Service pack:Microsoft 平台SDK (2001/11月) 或最近发布的Microsoft 平台SDK: 推荐使用2003 SDK RC2版本Visual C++ 6.0 或者Visual C++ .NET (2002 or 2003 or 2005 or 2008 )用Visual C++ 6.0 IDE创建一个64位应用程序设置64位创建环境变量, 用下面任何一种方式都行:方式一:点击”开始”菜单, 指向“Microsoft Platform SDK” > “Open Build Environment Windows” > “Set Windows XP 64 Build Environment”, 然后点击”Set Windows XP 64 Build Environment (Debug)”, 这时, 一个控制台窗口将显示, 一行文本显示像” the build environment set for a 64-bit”.方式二:在命令提示符下,1. 点击”开始”菜单, 然后点击”运行”2. 键入”command.exe”(没有引号), 然后, 点击”确定”3. 变化当前目录到C:\Program Files\Microsoft SDK(你的SDK安装目录), 然后键入”SetEnv.bat /XP64”(没有引号)现在, 开始启动Visual C++ 6.0并用我们刚才配置好的创建环境1. 在同一个命令窗口中(也就是你刚才设置64位环境的命令行窗口), 打开Visual Studio.2. 键入“Msdev /useenv”(没有引号). 请注意, 不要打开一个新的命令行窗口, 再去打开Msdev.exe, 现在Visual C++ 6.0 IDE 已经显示, 并且include, library及executable目录均被设置为64位的创建环境(注:查看这些配置, 点击Tools > Options > Directories, 在”Show directories for: “下拉列表中查看相应目录配置).另外, 如果Msdev.exe不在当前路径下(通常是系统环境变量没有相应指示), 变化目录到你所安装Visual Studio的目录下, 例如: \Microsoft Visual Studio\Common\Msdev98\Bin, 然后, 再键入Msdev.exe.译注: 在前面的设置64位创建环境变量, 已经将IDE的executable执行目录调整到SDK的相应目录下面, 也就是说, 作为可执行程序: 编译器和链接器是在SDK目录中, 而不再是默认的\Microsoft Visual Studio\Common\Msdev98\Bin添加一个64位Debug配置1. 在Visual C++ IDE中, 打开一个已经在的32位工程(例如: MyApplication)2. 在”Build”菜单上, 点击”Configurations”.3. 在”Configurations”对话框上, 点击”Add”.4. 在”Add Project Configuration”对话框上, 设置”Configuration”到Debug64, 然后, 在”Copy Settings from”列表框中点击”MyApplication –Win32 Debug”5. 点击”OK”完成设置, 点击”Close”关闭.设置激活配置为64位1. 在”Build”菜单上, 点击”Set Active Configuration”.2. 点击”MyApplication –Win32 Debug64”, 然后, 点击”OK”.修改编译器和链接器的参数配置由于64位的编译器和链接器的参数配置和32位的有些不一样, 我们需要修改部分选项, 下面是这些配置步骤:1. 在”Project”菜单中,点击”Settings”.2. 在”Project Settings”对话框中, 点击”General”标签. 在”Output directories”, 在”Intermediate files” 和”Output files”输入框中, 键入”Debug64”(没有引号)3. 在”C/C++”标签上, 在”Debug info”下拉列表中, 选择”Program database(参数选项对应是/Zi)4. 在”Link”标签上, 在”Project options”的输入框中, 变化”/machine:I386”(没有引号)到”/machine:IA64”(没有引号)译注: 正确设置应是: /machine:AMD645. 在”View”菜单上, 点击”Workspace”.6. 然后, 移除帮助文件MyApplication.hpj7. 如果你的应用程序是基于MFC的, 你必须添加一个MFC路径以避免链接错误:LNK1004 on the Mfc42d.lib, 请按下面步骤操作:a. 在”Tools”菜单上, 点击”Options”.b. 在”Directories”标签上, 在”Show directories”下拉列表中, 选择”Library Files”, 现在添加你的平台库所在路径: ”\Microsoft SDK\lib\IA64\mfc”(没有引号)译注补充: 在”C/C++”标签上, 在”Preprocessor definitions”输入框中将WIN32改成WIN64创建并调试这个工程1.现在Build这个工程, 生成64位应用程序, 这个应用程序被部署在一个IA64计算机上.2.要在Visual C++ 6.0中运行这个.exe文件, 按下面步骤:注意: 你不能够在Visual C++ 6.0 IDE中调试这个.exe文件.a. 在你的IA64计算机上, 创建一个文件夹: C:\VC6MSVCMON从X86(32位)计算机上拷贝这些文件到这个新创建的文件夹中:Msvcmon.exeDm.dllMsdis110.dllTln0t.dll上面这些文件应在你的Visual C++ 6.0安装目录下:\Visual Studio\Common\MSDev98\Binb. 在拷贝完这些文件后, 在IA64计算机上运行Msvcmon.exe, 然后, 点击”Connect”.c. 在X86(32位)计算机上, 打开Visual C++ 6.0 IDE, 在”Build”菜单上, 点击”Debugger Remote Connection”.d. 在”Remote Connection”对话框中, 点击”Network TCP/IP”, 然后, 点击”Settings”.e. 在”Target computer name of address”输入框中, 键入IA64计算机的名称. 点击”ok”两次, 关闭对话框.f. 在Visual Studio C++ IDE中, 在”Project”菜单上, 点击”Settings”, 在左侧面板, 展开”MyApplication”, 然后, 点击”Debug”标签. 你将注意到”Executable for debug session”输入框包含了MyApplication.exe的路径, 看起来是C:\<X86Path>\MyApplication.exe.g. 在”Remote executable path and file name”输入框中, 键入”MyApplication.exe”(没有双引号)所在的全路径, 这个路径看起来像: \\<X86ComputerName>\C$\<x86Path>\MyApplication.exe(没有引号).点击”OK”关闭该窗口.h. 按下CTRL+F5或在”Build”菜单上点击”Execute MyApplication.exe”, 开始运行这个.exe文件, 这个.exe文件现在是运行在IA64计算机上.注意:如果MyApplication是一个MFC应用程序并且这个工程用到了MFC相关的.dll文件, 请确信在IA64计算机上, 那些.dll文件从\Microsoft SDK\NoRedist\Win64文件夹中已被拷贝到\System32文件夹中.译注:\Microsoft SDK\NoRedist\Win64存放的是debug和release版本的MFC, ATL相关dll(64位), 实际上你也可以拷贝这些dll文件到你的可执行.exe文件所在同一目录中.这些dll文件是:Mfc42d.dllMfco42d.dllMsvcrtd.dll译注补充: 编译/链接中经常遇到的问题:∙链接出错, 通常是RTC, cookie错误, 参见下面链接设置:/?scid=kb%3Ben-us%3B894573&x=15&y=14∙链接中如出现Error Spawing bscmake.exe去掉勾选编译参数(Project settings > c/c++): Generate Browse Info如果仍不成功, 请仔细检查在菜单项”Tools” > “Options” , 定位在”Directories”标签, 选择”Executable Files”, 在下面的目录列表中, 将<SDK安装目录>\bin路径放在第一项.(这个目录中的64位编译器和链接器程序将重载旧的32位设置).∙如果你是动态库和主应用程序链接, 必须保持用的是相同运行时库, 例如: 全部都是Multi-Threads DLL(点击”Project” > “Settings”, 选择”C/C++”标签, 在”Category”下拉列表中选择”Code Generation”, 在下面”Use runtime library”下拉列表中选择).用Visual C++ .NET IDE创建一个64位应用程序警告: 在已安装Visual Studio .NET的计算机上, 请不要同时安装64位版本的WinDbg调试器工具, 请读平台SDK的Readme.doc(位置在: C:\Program Files\Microsoft SDK\Bin\Win64\Readme.doc).设置64位创建环境变量, 用下面任何一种方式都行:参照前文相同部分.开始启动Visual C++ .NET, 并用刚才我们创建好的64位环境1. 在64位SDK环境设置的命令行窗口中,打开Visual Studio .NET.2. 键入”devenv /useenv”(没有引号), 然后, 点击”OK”. 现在include, library, executable目录被设置成为64位SDK所在目录.注意: 如果Devent.exe不在当前路径(通常是在系统环境变量Path中未指定Visual Studio .NET安装目录), 请改变文件夹路径到<Visual Studio .NET安装目录>\Microsoft Visual Studio .NET\Common7\IDE, 然后再运行上述命令.警告:在你运行这个命令后, Visual Studio .NET IDE就被设置成为64位的开发环境, 如果你想清除这个环境, 在打开一个新的Visual Studio .NET IDE之前, 删除在C:\Documents and Settings\<Username>\Local Settings\ApplicationData\Microsoft\VisualStudio\7.0 下的Vccomponents.dat文件.添加一个64位调试配置1. 打开一个已存在的32位工程(例如, MyApplication).2. 在”Build”菜单上, 点击”Configuration Manager”.3. 在”Active Solution Configurations”列表中, 点击”New”.4. 在”New Solution Configurations”对话框中, 在”Solution Configuration Name”下面选择”Debug64”(不包含引号), 并且在”Copy Settings From”下面选择”Debug”.5. 点击”OK”.6. 在”Configuration Manager”对话框中, 在”Active Solution Configuration”列表中, 点击选择”Debug64”, 然后点击”OK”.修改编译器和链接器设置由于64位的编译器和链接器的参数配置和32位的有些不一样, 我们需要修改部分选项, 下面是这些配置步骤:1. 在”Solution”(中文:解决方案)浏览窗口中, 右键”Project”, 然后, 点击”Properties”.2. 在”C/C++”节点, 选择”General”. 设置”Debug Information Format”到”Program Database”(对应的编译选项是/Zi).3. 在”C/C++”节点中, 选择”Code generation”. 设置”Buffer Security Check”到”No”(对应的编译选项是/GS).4. 在”Linker”节点, 选择”Command Line”.在”Additional Options”下面, 添加”/MACHINE:IA64”(没有引号).5. 如果你的应用程序是基于MFC的,你必须添加MFC路径以避免收到链接错误:LNK1104 on the Mfc42d.lib file.添加MFC路径, 按下面步骤:a. 在”Tools”菜单上, 点击”Options”.b. 在”Projects”下面, 选择”VC++ Directories”. 在”Show directories”列表中, 选择”Library Files”.如果库路径没有列出, 添加这个库路径"\Microsoft SDK\lib\IA64\mfc"(没有引号).注意:如果MyApplication是一个MFC应用程序并且这个工程用到了MFC相关的.dll文件, 请确信在IA64计算机上, 那些.dll文件从\Microsoft SDK\NoRedist\Win64文件夹中已被拷贝到\System32文件夹中.这些dll文件是:Mfc42d.dllMfco42d.dllMsvcrtd.dll完成这些后, 就可以build 64位可执行程序了. 调试工程参照Visual C++ 6.0 IDE部分.更多参考在:64-Bit Programming with Visual C++64位程序移植问题。
从32位向vs64过度
int *pi;
for( int i = 0; i < 10; i++,p++) {
pi = (int*)p;
printf("i = %d \tpi=%d\n",i,*pi);
}
在x86上是正常工作的,但是换了环境就不行了
主要是内存操作的时候可能出问题,像拷贝,强制指针类型转换之类的操作。拷贝的时候,尽量用sizeof来操作,不要用写死的4,8之类的数字。
64-bit and Visual Studio 2005
/b/deeptanshuv/archive/2006/04/11/573795.aspx
64-Bit .NET Framework Development
/forums/en-US/netfx64bit/threads/
其实总的说来就是数据类型的长度问题,细说的话要注意以下几个方面
a ) int func();
b ) return val;
c ) void func( int val );
d ) (const void*)&val..
e ) struct stat st;
32位程序移植到64位平台
64系统已经为32位的应用程序准备了运行32位程序的环境,这个环境就是WOW64。
WOW64 是 Windows-32-on-Windows-64 的缩写。它为现有的 32 位应用程序提供了 32 位的模拟,可以使大多数 32 位应用程序在无需修改的情况下运行在 Windows 64 位版本上。
比如卸载程序列表:
xp 位于如下位置:
软件移植:从win32到x64
随着软件对计算机主存的需求的扩张,32位平台的4G主存寻址空间逐渐成为机器性能的瓶颈,长期来看,解决这一矛盾的最优方案是使用支持更大主存空间的软件运行平台。
就当前来所,PC机上支持更大地址空间的硬件平台就是x64了,当然除了硬件外还需要64位的操作系统和运行时库的支持,才能运行64位的应用程序,本文将主要讲解windows环境下的软件如何升级至x64版本。
1. 准备工作为了保证升级过程顺利进行,需要一些资源。
1.1 目标平台为了运行和测试64位的软件,需要相应的支撑平台。
硬件:需要支持64位运算的处理器如amd64构架或Intel 64构架。
操作系统:64位操作系统,这里只讨论windows平台,微软从windows xp以后所有的操作系统都有相应的64位版本,本文以Windows XP 64bit Edition为例。
目标操作系统可以安装在物理机器上,也可以使用虚拟机安装,当然硬件都必须支持64位才可以,另使用虚拟机安装64位系统时,需要处理器支持虚拟化技术。
运行时库:需要64位运行时库,这可以从编译环境获得。
1.2 编译器这里需要到目标平台的编译器,即x64编译器,编译器本身不一定是64位的;除编译器外,对应的开发库和头文件也是必须的,为了方便,最好使用集成开发环境,如visual Studio,自vs2005后开始有64位编译器(vs本身是32位的),但默认不会安装,如果已安装vs2008(或2005/2010),则通过重新运行安装程序添加删除功能,添加x64编译器即可,如下图:2. 配置x64编译选项2.1 增加x64目标平台打开需要移植的项目,在解决方案管理器中,项目节点单击右键选择属性,打开项目属性对话框,并打开配置管理器,如下图:在“活动解决方案平台”下拉列表中选择新建,打开“新建解决方案平台”对话框:在新的平台中选择x64,并从现有win32平台复制且创建新的项目平台,单击确定,即完成平台的创建。
32位程序移植到64位需要考虑的问题
32位程序移植到64位需要考虑的问题概述从32位到64位,根本性的区别在于两种数据类型发生了变化:long和pointer。
在32位环境下,两者长度都是32位,也就是4个字节;而在64位环境下都是8个字节。
所以当你把pointer或者long 型数据赋给int型时,会发生数据截断(data truncation)。
1、32位与64位数据模型之间的区别32位应用的数据模型我们称作ILP32(之所以这样命名,是因为int,long,pointer都是32位),而64位应用则采用LP64模型(意味着long,pointer变成64位了,其他的不变)。
在当前的32位环境下,我们可以认为int,long,pointer是等价的,因为它们占用相同的字节,于是就有很多混用的情况;但是到了64位的时代,long和Poniter的大小都改变了,原来的假设不再成立。
2、注意int和pointer转换因为integer与pointer大小相同,所以32位代码中常常把pointer转换为int或者unsigned int,以便算术运算。
为了移植,你可以把pointer转换为unsigned long,因为long和pointer都是等长的,无论是在ILP32或LP64。
但是,为了使代码更清晰,推荐用uintptr_t,uintptr_t和intptr_t都需要包含头文件inttypes.h。
例如:下面代码在64位环境下编译出错:[cpp] view plain copy1.char *p = &something;2.p = (char *) ((int)p & PAGEOFFSET);3.4.% cc ..5.warning: conversion of pointer loses bits改用uintptr_t后,无论是32位或者64位都没问题:[cpp] view plain copy1.char *p = &something;2.p = (char *) ((uintptr_t)p & PAGEOFFSET);3、注意int和long转换在ILP32中,可能从未对int和long加以区分,因此,混用的情况非常多,看下面代码:[cpp] view plain copy1.int A = 0;2.long B = 0;3.long C = 0;4....5.A = B + C;6.7.8.% cc9.warning: assignment of 64-bit integer to 32-bit integer 4、结构体字节对齐及大小问题在结构体中,各个成员的起始地址都是对齐字节的倍数,例如:[cpp] view plain copy1.struct T2.{3.int i;4.long j;5.int k;6.char *p;7.};在ILP32中,sizeof(T)应该是16字节;在LP64中,应该是32!因为此时long/char *的对齐字节都变为8,为了保证满足对齐要求,i/k都被扩展为8字节了,又例如:[cpp] view plain copy1.struct T2.{3.char *p;4.long j;5.int i;6.int k;7.};此时,无需扩展,sizeof(T)=8+8+4+4=24.5、注意union例如:[cpp] view plain copy1.union U2.{3.double _d;4.long _l[2];5.};在ILP32中,两者大小相同都是8字节;移植到LP64,前者不变,后者为16字节,应改为:[cpp] view plain copy1.union U2.{3.double _d;4.int _l[2];5.};6、注意移位操作无类型的整数常量就是(unsigned) int 类型的,这可能会导致在位移时出现被截断的问题。
32位项目转64位项目的个人体会
32位项目转64位项目的个人体会32位项⽬转64位项⽬的个⽬体会由于项⽬需要,最近将办公室⽬的⽬个学长写的MFC项⽬从vs2010移植到vs2013,出现了⽬堆多字节转到Unicode 的错误,其实在写这个项⽬的时候就有想过为什么不⽬Unicode,《windows核⽬编程》⽬⽬也建议使⽬Unicode,引⽬如下:①Unicode使程序的本地化变得更容易。
②使⽬Unicode,只需发布⽬个⽬进制(.exe或DLL)⽬件,即可⽬持所有语⽬。
③Unicode提升了应⽬程序的效率,因为代码执⽬速度更快,占⽬内存更少。
④Windows内部的⽬切⽬作都是使⽬Unicode字符和字符串来进⽬的。
所以,假如你⽬要传⽬ANSI字符或字符串,Windows就会被迫分配内存,并将ANSI字符或字符串转换为等价的Unicode形式。
使⽬Unicode,你的应⽬程序能轻松调⽬所有不反对使⽬(nondeprecated)的Windows函数,因为⽬些Windows函数提供了只能处理Unicode字符和字符串的版本。
⑤使⽬Unicode,你的代码很容易与COM集成(后者要求使⽬Unicode字符和字符串)。
⑥使⽬Unicode,你的代码很容易与.NET Framework集成(后者要要求使⽬Unicode字符和字符串)。
⑦使⽬Unicode,能保证你的代码能够轻松操纵你⽬⽬的资源(其中的字符串总是Unicode的)。
但⽬板要⽬多字节,于是结果就是傻傻的改了⽬下午,可怜的是最后在Microsoft官⽬看到⽬个2013安装多字节的⽬插件。
当然由于还是希望⽬Unicode,所以改了就算了。
然后现在⽬说要从32位转成64位,于是⽬⽬堆外部符号⽬法解析,总结了三种可能性:①解决⽬案⽬有dll项⽬但未被exe添加引⽬;②未添加附加依赖库;③lib与所包含的头⽬件不匹配。
只能重新将引⽬的dll、lib编译出64位的,再配置环境。
本以为最后⽬成成功的时候就完事了,结果⽬运⽬,弹出“应⽬程序⽬法正常启动”,为此⽬折腾了⽬个星期,在⽬上搜不到结果,在群⽬询问也⽬⽬解答,最后排除的可能就是64位程序引⽬了32位的lib,没办法只能重新将lib⽬个⽬个替换排除。
软件移植:从win32到x64
随着软件对计算机主存的需求的扩张,32位平台的4G主存寻址空间逐渐成为机器性能的瓶颈,长期来看,解决这一矛盾的最优方案是使用支持更大主存空间的软件运行平台。
就当前来所,PC机上支持更大地址空间的硬件平台就是x64了,当然除了硬件外还需要64位的操作系统和运行时库的支持,才能运行64位的应用程序,本文将主要讲解windows环境下的软件如何升级至x64版本。
1. 准备工作为了保证升级过程顺利进行,需要一些资源。
1.1 目标平台为了运行和测试64位的软件,需要相应的支撑平台。
硬件:需要支持64位运算的处理器如amd64构架或Intel 64构架。
操作系统:64位操作系统,这里只讨论windows平台,微软从windows xp以后所有的操作系统都有相应的64位版本,本文以Windows XP 64bit Edition为例。
目标操作系统可以安装在物理机器上,也可以使用虚拟机安装,当然硬件都必须支持64位才可以,另使用虚拟机安装64位系统时,需要处理器支持虚拟化技术。
运行时库:需要64位运行时库,这可以从编译环境获得。
1.2 编译器这里需要到目标平台的编译器,即x64编译器,编译器本身不一定是64位的;除编译器外,对应的开发库和头文件也是必须的,为了方便,最好使用集成开发环境,如visual Studio,自vs2005后开始有64位编译器(vs本身是32位的),但默认不会安装,如果已安装vs2008(或2005/2010),则通过重新运行安装程序添加删除功能,添加x64编译器即可,如下图:2. 配置x64编译选项2.1 增加x64目标平台打开需要移植的项目,在解决方案管理器中,项目节点单击右键选择属性,打开项目属性对话框,并打开配置管理器,如下图:在“活动解决方案平台”下拉列表中选择新建,打开“新建解决方案平台”对话框:在新的平台中选择x64,并从现有win32平台复制且创建新的项目平台,单击确定,即完成平台的创建。
AIX下C程序从32位迁移到64位方法参考
符号扩展
要避免有符号数与无符号数的算术运算.在把int与long数值作对比时,此时 产生的数据在LP64和ILP32中是有差异的.因为是符号位扩展,所以这个问 题很难被发现,只有保证两端的操作数均为signed或均为unsigned,才能从 根本上防止此问题的发生.例如:
符号扩展
Test6.c update
[root@p5502#]cc -q64 -qwarn64 test6.c [root@p5502#]./a.out Answer: -1
迁移注意事项
下面介绍一下从32位的应用如何迁移到64位,以及可能遇到的一些问题:
编译支持64位的方法 Integer,Long,Pointer之间转换 对Long类型变量的操作 符号扩展 数据内存分配 数据共享问题
编译支持64位方法
简单来讲,将32位应用转为支持64位,有以下2个方法:
32/64位环境介绍
在AIX环境下,C/C++语言提供两种不同的编程模式:IPL32和PL64.
IPL32 ● 表示integer/pointer/long三种数据类型是32位(4个字节),在这种模式下,提供32 位的地址空间,理论的内存使用限制为4G.
PL64 ● 表示pointer/long两种数据类型是64位(8个字节),提供64位地址空间,使用内存超 过4G(达260 bytes=1EB).
对LONG类型变量的操作
对long变量做位移的操作,也会导致不同的结果
在对long变量做左位移操作时,在32bit和64bit下会引起不同的结果,例如下
面的代码:long l=value1 << 1;在下面数据操作中会有差异:
初始值 换算值 位移之后的结果 32bit 0x7FFFFFFFL 0x80000000L 0xFFFFFFFFL INT_MAX INT_MIN UINT_MAX 0xFFFFFFFE 0x00000000 0xFFFFFFFE 64bit 0x00000000FFFFFFFE 0x0000000100000000 0x1FFFFFFFE
将驱动移植到64位Windows操作系统
将驱动移植到64位Windows操作系统x64位操作系统和x32位操作系统的最大区别就是内存寻址方式的不同。
而64位操作系统不支持32位的驱动程序,因为驱动程序和windows内核同处于一个地址空间中。
这是移植32位驱动到64位驱动的最大原因。
当然,64位驱动程序可以使用更大的分页内存,非分页内存及系统缓存。
而且,你的设备从此就支持64位windows操作系统了。
1.在X64下的驱动程序安装除了要把应用程序的32位驱动程序变成64位程序之外,驱动的安装程序和其它配置文件同样需要修改。
也就是说,对于要在x64上运行的32位程序,它所依赖的驱动仍然需要是64位的。
这些相关程序包括inf文件,device installers, class installers和co-installers。
相关资料可查看MSDN Libarary DDK:Porting Your Driver to 64-Bit Windows。
所以,要改造应用程序的安装程序。
方法是,让32位版的驱动安装为缺省安装选项,即用户插入安装光盘之后,依然运行32位安装程序。
但当程序调用UpdateDriverForPlugAndPlayDevices返回值为ERROR_IN_WOW64时,这说明该安装程序正运行在64位Windows环境中。
此时,这个安装程序应该调用CreateProcess函数来启动64位的安装进程。
这个64位的安装进程通过调用64位驱动目录下的inf文件进行驱动安装。
2.驱动要支持32位IOCTL某些IOCTL可能包含含有指针的结构,所以,要特别小心的区别对待它,必须根据被调用者解析结构或者输出结构。
有三种办法可以解决这个问题:1.尽量避免使用IOCTL传递包含有指针的结构;2.通过API IoIs32bitProcess()来判断上层调用者的程序类型;3.在64位程序中采用新的IOCTL命令;例子:IOCTL structure in header filetypedef struct _IOCTL_PARAMETERS {PVOID Addr;SIZE_T Length;HANDLE Handle;} IOCTL_PARAMETERS, *PIOCTL_PARAMETERS;32-bit IOCTL structure//// This structure is defined// inside the driver source code//typedef struct _IOCTL_PARAMETERS_32 {VOID*POINTER_32 Addr;INT32 Length;VOID*POINTER_32 Handle;} IOCTL_PARAMETERS_32, *PIOCTL_PARAMETERS_32;32-Bit and 64-Bit IOCTL#ifdef _WIN64case IOCTL_REGISTER:if (IoIs32bitProcess(Irp)) {/* If this is a 32 bit process */params32 = (PIOCTL_PARAMETERS_32)(Irp>AssociatedIrp.SystemBuffer);if(irpSp->Parameters.DeviceIoControl.InputBufferLength < sizeof(IOCTL_PARAMETERS_32)) {status = STATUS_INVALID_PARAMETER;} else {LocalParam.Addr = params32->Addr;LocalParam.Handle = params32->Handle;LocalParam.Length = params32->Length;/* Handle the ioctl here */status = STATUS_SUCCESS;Irp->rmation = sizeof(IOCTL_PARAMETERS);}} else { /* 64bit process IOCTL */} else { /* 64bit process IOCTL */params = (PIOCTL_PARAMETERS)(Irp->AssociatedIrp.SystemBuffer);if (irpSp->Parameters.DeviceIoControl.InputBufferLength< sizeof(IOCTL_PARAMETERS)) {status = STATUS_INVALID_PARAMETER;} else {RtlCopyMemory(&LocalParam, params,sizeof(IOCTL_PARAMETERS));/* Handle the ioctl here */status = STATUS_SUCCESS;}Irp->rmation = sizeof(IOCTL_PARAMETERS);}break;3.64-Bit INF 文件要求在Windows Server 2003SP1之后,64位驱动的安装被提高了要求。
32位应用程序到64位应用程序的迁移
将程序移植到64位Windows雷立辉整理简介:本文对如何将32位Windows程序平滑的支持和过渡到64位Windows操作系统做出了一个简单而系统的介绍。
包括对于64位操作系统的版本,编程模型,一些移植原则甚至包括对驱动程序的移植原则的介绍。
作者介绍:系统分析员,现在在北京工作。
作者的blog:. 前言:或许大家还对32位的CPU及操作系统使用还是觉得非常的合乎日常需要,但Windows 64位已经悄悄的来到了各位的身边。
不少软件厂商也纷纷宣称自己的软件已经支持64位操作系统了。
笔者在几个月之前就成功的实施了一个软件的64位操作系统移植。
大致方案是,上层应用程序仍然使用32位程序,但将该系统软件的驱动程序统统的变成了64位。
这也是让应用程序支持64位的最小代价。
整个过程前后不到一个月(两个人月),就解决了大部分问题。
而一些难啃的骨头都是因为以前的编码不太规范而引起的。
因为这不是本文的主题,所以就此打住。
下面的内容就是我在工作过程中整理各种资料所得到的成果。
为了文章的系统性,中间转贴了一些MSDN中文网站的内容。
希望能对大家的工作有所帮助。
一.最有可能受益于64位的应用l需要大量的可寻址内存,因而系统总体内存需求超过4GB 的应用。
例如那些采用大型数据集的应用(金融和科学建模软件)和基于主机的桌面应用(在不降低性能的情况下同时运行多个线程);l必须同时管理大量的用户或者应用线程,例如大规模的瘦客户端解决方案,大型数据库,以及用于客户关系管理(CRM)、供应链管理(SCM)、企业资源规划(ERP)和数字版权管理(DRM)系统中的解决方案的数据仓库应用;l需要通过实时加密和解密提高安全性的应用,包括电子商务应用和对专用或者分类数据的保护;l需要数学精度和浮点性能的应用,包括建模、模拟、统计和金融分析、图像/视频/信号处理、物理、医学研究、远程通信、加密和压缩;l需要大规模的、强大的数据库性能的应用,包括决策支持,搜索和索引,文档和内容管理,以及语音识别;l需要64 位计算的大内存寻址功能的应用,包括很多高性能计算(HPC)群集应用;l需要提供数字内容创建功能,例如计算机辅助设计、制造和工程(CAD、CAM 和CAE)、数字音乐制作和视频编辑,以及实时媒体流解决方案;l需要通过最大限度的性能实现逼真的影院级消费者体验,包括计算机游戏、数字视频和协作;l需要将以前只限于64 位工作站的功能移植到企业、消费者和计算机爱好者的台式机中,包括3D 建模、渲染、动画、模拟和软件开发。
32位应用程序到64位应用程序的迁移
将程序移植到64位Windows雷立辉整理简介:本文对如何将32位Windows程序平滑的支持和过渡到64位Windows操作系统做出了一个简单而系统的介绍。
包括对于64位操作系统的版本,编程模型,一些移植原则甚至包括对驱动程序的移植原则的介绍。
作者介绍:系统分析员,现在在北京工作。
作者的blog:. 前言:或许大家还对32位的CPU及操作系统使用还是觉得非常的合乎日常需要,但Windows 64位已经悄悄的来到了各位的身边。
不少软件厂商也纷纷宣称自己的软件已经支持64位操作系统了。
笔者在几个月之前就成功的实施了一个软件的64位操作系统移植。
大致方案是,上层应用程序仍然使用32位程序,但将该系统软件的驱动程序统统的变成了64位。
这也是让应用程序支持64位的最小代价。
整个过程前后不到一个月(两个人月),就解决了大部分问题。
而一些难啃的骨头都是因为以前的编码不太规范而引起的。
因为这不是本文的主题,所以就此打住。
下面的内容就是我在工作过程中整理各种资料所得到的成果。
为了文章的系统性,中间转贴了一些MSDN中文网站的内容。
希望能对大家的工作有所帮助。
一.最有可能受益于64位的应用l需要大量的可寻址内存,因而系统总体内存需求超过4GB 的应用。
例如那些采用大型数据集的应用(金融和科学建模软件)和基于主机的桌面应用(在不降低性能的情况下同时运行多个线程);l必须同时管理大量的用户或者应用线程,例如大规模的瘦客户端解决方案,大型数据库,以及用于客户关系管理(CRM)、供应链管理(SCM)、企业资源规划(ERP)和数字版权管理(DRM)系统中的解决方案的数据仓库应用;l需要通过实时加密和解密提高安全性的应用,包括电子商务应用和对专用或者分类数据的保护;l需要数学精度和浮点性能的应用,包括建模、模拟、统计和金融分析、图像/视频/信号处理、物理、医学研究、远程通信、加密和压缩;l需要大规模的、强大的数据库性能的应用,包括决策支持,搜索和索引,文档和内容管理,以及语音识别;l需要64 位计算的大内存寻址功能的应用,包括很多高性能计算(HPC)群集应用;l需要提供数字内容创建功能,例如计算机辅助设计、制造和工程(CAD、CAM 和CAE)、数字音乐制作和视频编辑,以及实时媒体流解决方案;l需要通过最大限度的性能实现逼真的影院级消费者体验,包括计算机游戏、数字视频和协作;l需要将以前只限于64 位工作站的功能移植到企业、消费者和计算机爱好者的台式机中,包括3D 建模、渲染、动画、模拟和软件开发。
oracle32位迁移到64位
作完了,把步骤贡献给大家---升级步骤1、确认数据库版本select * from v$version;2、32位和64位的数据文件、控制文件、日志文件都是相同格式的,可以直接拷贝使用;二者的区别在于存储过程的word size不同,对于32位的存储过程迁移到64位之后需要重新编译,否则,product用户连接时,会出错ERROR:ORA-06553: PLS-801: internal error [56319]ERROR:ORA-06553: PLS-801: internal error [56319]Error accessing package DBMS_APPLICATION_INF并且product下的触发器不能执行。
3、升级过程32位库关闭,做冷备份。
4、把32位库的数据文件、联机日志、控制文件、密码文件、sp文件拷贝到64位机器相同的目录下;5、64位数据库cd $ORACLE_HOME/rdbms/adminsqlplus ' / as sysdba'startup upgrade; //不是正常的starup@utlirp@utlrp6、64位库新开一个连接,不断执行SELECT COUNT(*) FROM obj$ WHERE status IN (4, 5, 6);结果不断减少,代表编译进行。
7、当7异常退出时,重新执行@utlrp,并在6的窗口中监控进度,这个过程需要反复好几次,直到最后,会有几十个对象无法重新编译;select object_name,object_type,owner from dba_objects where status <>'VALID';这些对象都是和olap相关的,但是我们的系统没有用到olap功能。
所以只需要把olap重建。
8、重建olapcd $ORACLE_HOME/olap/adminsqlplus ' / as sysdba'删除@catnoamd.sql@olapidrp.plb重建@olap SYSAUX TEMP9、最后查看select object_name,object_type,owner from dba_objects where status <>'VALID';10、shutdown;11、startup;。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第24卷第3期 计算机应用与软件Vol 124,No .32007年3月 Computer App licati ons and Soft w are Mar .200732位到64位的移植宿继奎1 吴亚栋1 吕必俊21(上海交通大学计算机科学与工程系 上海200240)2(复旦大学计算机科学与技术系 上海200433)收稿日期:2005-09-16。
宿继奎,硕士生,主研领域:语言识别。
摘 要 随着64位的到来,原来很多32位的应用很多要做移植才能充分发挥64位系统的性能。
基于实际移植中的经验,介绍了这方面应该注意的问题。
关键词 64位 移植PO RT I NG FROM I A32TO I A64Su J ikui 1 W u Yadong 1 L üB ijun21(Co m puter Science &Engineering D epart m ent,Shanghai J iaotong U niversity,Shanghai 200240,China )2(Co m puter Science &Technology D epart m ent,Fudan U niversity,Shanghai 200433,China )Abstract The move t o 642bit computing is upon us .M any app licati ons need t o be ported t o enj oy the great perf or mance 64bit .This paper addresses most significant issues that s oft w are devel opers should face in porting s ource code t o the 642bit world .Keywords 64bit Porting1 引 言在信息技术领域,“字长”是衡量计算机性能的重要标准之一。
字长在很大程度上决定着计算机的内存最大容量、文件的最大长度、数据在计算机内部的传输速度、处理速度和精度等性能指标。
在近十年的时间里,X86-32位平台广泛应用在各种计算环境,但随着各行业信息化的逐步深入,越来越多的操作系统和应用程序对处理器的运算能力以及内存的容量都提出了极高的要求,这使得以往的32位计算平台在越来越多的高端应用中显得力不从心。
64位计算技术为这一问题的解决提供了契机,64位技术可以突破这些限制,使得处理器的计算能力有了更加广阔的发展空间,而且其所能支持的内存寻址能力更是达到了180亿G B,将能够彻底解决32位计算系统所遇到的瓶颈现象。
64位计算的来临,使得很多原来32位的开发人员需要面临新的问题。
64位设计成尽量与32位兼容,相当一部分代码可以直接编译然后运行在64位的系统上,可是并不完全是这样。
本文就是讨论这个问题的,主要来自于在将一整套网络协议栈从32位移植到64位的平台上获得的经验。
(C 语言,类W indows 系统)2 64位的位模式在很多情况下,移植到I A 64只需要重新编译,但这基于代码是符合I A 64的假设。
如果不是,那么就要做移植的工作,需要了解新平台的特性。
通常移植需要考虑不同的数据模型,数据类型,指针句柄,编译器开关。
2.1 数据模型I A 32的体系结构下,integer,l ong,和pointer 都是32位的,秒为I L P32数据模式。
I A 64下,UN I X 和W indows 采用了不同的数据模型。
UN I X 下面是LP64数据模型,就是l ong,pointer 都是64位,W indows 下面是P64数据模型,pointer 是64位,l ong 仍然是32位。
2.2 数据类型UN I X 和W indows 都引入了新的数据类型[1]。
表1 W i n dows 的新的显式大小数据类型体系结构新的数据类型旧的数据类型64位int64_t,uint64_t l ong l ong 32位int32_t,uint32_t int,unsigned int 16位int16_t,uint16_t short,unsigned short8位int8_t,uint8_tchar表2 UN I X 的新的显式大小数据类型体系结构新的数据类型旧的数据类型64位I N T64,U I N T64,LONG64,ULONG64,DWORD64_int64,unsigned_int6432位I N T32,U I N T32,LONG32,ULONG32,DWORD32int,unsigned int 16位short,unsigned short8位char第3期 宿继奎等:32位到64位的移值175新的可变大小数据类型,指针类型根据体系结构的不同而不同-通常在编译时候指定。
这些类型在32位系统上是32位,在64位系统上是64位,不需要条件编译这些类型。
UN I X平台新的可变大小数据类型有:int p tr_t,uint p tr_t,这些整形数据可能包含强制转换的指针;l ong,size_t,ssize_t,这些整形数据通常包含数据。
W indows新的可变大小数据类型:int p tr_t,uint p tr_t(ANSI规范),LP ARAM,W P ARAM,LRES ULT,I N T_PTR,UN I T_PT R, DWORD_PTR,LONG_PTR,ULONG_PTR(W indows自定义),这些整形数据可能包含强制转换的指针;size_t,ssize_t(ANST规范),int3264,SI ZET,SSI ZE_T(W indows自定义),这些整形数据通常包含数据。
2.3 指针句柄由于数据模型的改变,指针类型长度在I A64上由32位变成64位,导致原来很多硬编码或者由其他数据通指针相互强制转的代码不能正常工作。
2.4 编译器开关对每种编译器,有不同的编译开关指示,具体的参见编译器说明。
3 移植存在的问题3.1 汇编代码intel64位指令集和32位的指令集不兼容。
I ntel和微软的64位编译器都不支持嵌入式的汇编。
I A32下的汇编代码必须完全重写,可能的话写成c/c++等高级语言代码或者用I A64的汇编语言重写,保存在一个单独的文件里,然后用函数来调用这些汇编代码。
这具有将不可移植的代码分离更容易扩展到其他平台优点。
3.2 硬编码的数据大小由于I A64上面数据大小同I A32上的可能不一致,原来很多基于某个数据类型大小是固定值的假设很可能就是错误的。
通常这也是可移植性比较差的代码。
而对于带有结构的数据结构,由于对齐引发的填充的影响,将导致结构大小同32位不同。
比如分配32个指针变量:mall oc(3234)。
在32位下,得到的是32个指针变量的大小,而在64位下,分配的内存不足以放下32个指针变量,这将导致接下来访问那段存储区域的代码发生错误。
应该用sizeof()来得到变量或者类型的大小。
3.3 16进制常量如果用16进制常量来表示一个特定的数值,可能需要修改代码以使代码正常工作,因为代表的值在64位下有可能不一样。
例如OxFFFFFFFF在32位下代表—1,在64位下代表4294967295。
而Ox100000000在32位下代表0,在64位下代表4294967296。
最好用const来定义一个常量,这样编译器会做类型检查。
而且最好加上一个合适的类型后缀,比如L或者UL。
3.4 i n t和指针相互混用int和指针现在的数据大小不同,这导致原来相互混用二者的代码可能出现编译警告。
比如将一个指针变量p赋值给一个32位的变量a:a=(int)p上述代码在32位下没有问题,到了64位下,由于指针p是64位的,而a是32位的,编译器通常会产生一个警告,提醒说可能有数据丢失。
一些对代码要求比较高的工程中可能采用了将编译警告处理为编译错误的编译选项,因为这通常意味着可能的错误和设计上的问题。
为了消除警告,修改如下:a=(int32_t)(int p tr_t)p反过来将保存的32位变量a赋值给一个指针变量p,原来代码:p=(int3)a修改为:p=(int3)(int p tr_t)a或者可以通过预处理指令#p rag ma pointer_size来处理这种情况。
操作指针的代码需要特别的小心。
哈希和排序等用到指针的代码可能因为指针大小的变化而同预期结果不同。
如果在32位和64位应用程序之间交换指针类型的数据,应该用共享内存或者网络传输一样的机制,指针数据应该解释为一个基址加上偏移,还有数据大小。
3.5 对 齐[2]许多计算机系统对基本数据类型的可允许存放的地址作出了一些限制,要求某种类型的对象地址必须是某个值的k(通常是2,4,8)的倍数。
比如对于10字节的fl oat数据,应该在16字节整除的地址。
而64位的整数数据,应该在8字节整除的地址。
无论数据是否对齐,I A32硬件都能正确工作。
而对于I A64,对于数据的自然对齐有了更严格的要求。
对齐问题带来的第一个影响是性能影响。
对不对齐的数据进行操作需要执行更多的存储器访问操作,从而降低系统性能。
为了代码在64位下更有效率,减少或避免数据颠簸,需要重新安排结构中的域或者改写代码。
对于频繁使用的数据结构尤其如此。
对结构中的域重新安排顺序,按照域的大小来排序,最大的放在结构的最前面,最小的放在最后。
但结构各个域的访问频率也是应该考虑的一个问题,这将影响到缓存(cache)的命中率:从缓存的角度考虑,结构的变大有可能导致原来的缓存高效的代码性能下降,这需要对代码重新进行效率的优化。
对齐问题带来的第二个影响就是对于结构中的域的偏移,不能简单的将前面各个元素的大小累加起来得到,需要考虑到对齐的影响,通常用offset of()宏来取得。
比如:32位代码64位代码typedef struct_F OO{ PCHAR p sz Na me; DWORD dwVal; }F OO,3PF OO; ……DWORD a Val=3(P DWORD)((P BYTE)F OO+4);typedef struct_F OO{ PCHAR p sz Name; DWORD dwVal; }F OO,3PF OO; ……DWORD a Val=3(P DWORD)((P BYTE)F OO+offset of(F OO,d w Val)); 3.6 格式化输入输出c语言标准为输出64位数据做了修改。
比如ANSI C为了以16进制输出64位的指针用%p而不是%x或者%u。