在64位操作系统上,下面程序返回啥结构

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在64位操作系统上,下面程序返回啥结构相关的知识,希望对你有一定的参考价值。

一、确定在64位操作系统上运行还是在WOW64下运行。

在Visual
Studio平台中最后对64位应用程序编译时,需要指定这个应用程序是在64位操作系统上作为本机应用程序运行还是在WOW64环境下运行。这个
WOW64环境是一个由操作系统提供的兼容性环境。这个环境主要是让32位应用程序也能够在64位的操作系统上运行。换句话说,在编译时要确定产生的应用
程序是真正的64位应用程序(只能够在64位操作系统上运行),还是伪64位应用程序(其实是32位应用程序,只是可以借助WOW64在64位操作系统上
运行)。

在确定这个内容的时候,有一个内容笔者要特别提醒
大家。通常情况下在64位操作系统上,所有使用NET Framework
1.1以前版本生成的应用程序都将被视作为32位应用程序,并且始终在32位公共语言运行上的WOW64环境下运行;而在2.0版本以后生成的32位特定
应用程序可以在64位平台上的WOM64环境下运行。这两个版本之间的细微差异,各位读者可以开发一个小程序测试一下即可。其中的内涵是只可意会、不可言
传呀。

二、正确部署Visual Studio开发环境。

在开发64位应用程序之前,需要明白一点。到目前
为止,Visual Studio
2008仍然是一个32位的应用程序。在安装部署时,如果是在X86的计算机上(32位操作系统),则其将安装32位的CLR版本。而如果在64位操作系
统上安装部署时,安装进程将同时安装32位的CLR版本和合适的64位CLR。注意当将其部署到64位操作系统的时候,它将在WOW64环境下运行。

此时笔者认为需要注意一个细节问题。当在
Wom64环境下运行32位应用程序时,应用程序只限于在一个处理器上执行。也就是说应用程序不能够享受64位操作系统所带来的性能上的提升。而单处理器
执行会降低32位应用程序在基于Itanium系统上运行时的性能和可伸缩性。为此如果对于性能要求比较高的应用程序或者有负载比较高的服务器,尽量不要
采用兼容的方式。即32位应用程序在32位操作系统上运行,而不要在Wom64环境下运行。否则的话,不但不能够享受64位操作系统带来的好处,反而会降
低应用程序原有的性能,得不偿失。

三、32位应用程序在64位CLR上运行可能导致意外的结果。

虽然64位操作系统提供另一个WOW64环境,使得32位应用程序能够在64位操作系统上运行。也就是说,在大部分情况下32位应用程序可以在32位或者64位操作系统上同等的运行,其最终的结果都是相同的。但是有时候也会有意外。这些意外主要是以下原因所造成的。

如在应用程序的结构中包含一些大小随平台而改变的成员。如指针类型的对象,其会操作操作系统位数的不同而改变。再如指针算法中如果包含固定大小,或者不正确的平台调用与COM声明等等,都会导致32位应用程序在64位CLR上运行出现一些意外的结果。

为此笔者特别提醒,如果开发人员设计一些兼容的应用程序时(即可以同时在32位与64位应用程序上运行),必须要注意这些因素对应用程序运行过程的影响。在开发中,要尽量避免使用这些对象,以免不必要的麻烦。

四、如何判断某个应用程序是否适合在64位操作程序上运行。

在应用程序开发时,开发人员可能会借鉴已有的应用
程序。此时他们就需要判断手中的应用程序能否在WOW64环境下运行。或者说,只有在特定的平台下,如32位操作系统或者64位操作系统下(而不是
WOM64)下运行。要实现这个目的的话,开发环境提供了一个Corflags的命令。简单的说,在命令行中使用corflags.exe可以确定某个
exe或者dll是仅仅在特定平台上运行,还是只可以在WOW64环境下运行。另外在必要的情况下,程序开发人员还可以利用这个命令来更改应用程序的平台
状态。

五、调试64位应用程序与32位应用程序之间的差异。

在开发平台中自带有应用程序的调试工具。应用程序
调试一般包括本地调试与远程调试。对于一些中大型的应用程序而言,远程调试是必须的。这里需要注意,在任何情况下,如果在64位计算机上安装远程调试都会
同时安装32位和64位版本的远程调试监视器。不过在调试64位应用程序的时候,则必须要选择正确的版本。如需要选择“远程调试器X64)。否则的话,调
试结果会有偏差。

下面介绍一下在64位平台上VS中会出现的编译错误

模块计算机类型“x64”与目标计算机类型“X86”冲突

一种可以解决的方法是:

1、修改目标计算机类型:项目->熟悉->连接器(Linker)->高级->目标计算机。然后把目标计算机类型改成X64。如下图所示:

2、配置管理器:解决方案平台(默认是Win32的)->选择配置管理器->活动解决方案平台下选择x64。如下图所示:

清楚一下项目 重新编译一下 OK!

项目生成64位的应用程序
参考技术A 64位操作系统,运行程序返回结果与运行程序是32位或64位不同有差别,最终是与程序编写的代码有关。

在 64 位 Windows 上安装 32 位或 64 位应用程序有啥区别?

【中文标题】在 64 位 Windows 上安装 32 位或 64 位应用程序有啥区别?【英文标题】:What's the difference between installing 32bit or 64bit apps on a 64bit Windows?在 64 位 Windows 上安装 32 位或 64 位应用程序有什么区别? 【发布时间】:2011-05-03 22:27:01 【问题描述】:

显然,您可以在 64 位 Windows 系统(Vista 或 7)上安装 32 位和 64 位编译的应用程序。

两个版本都可以在 64 位操作系统上运行的原因是什么?在 64 位操作系统上安装 64 位应用程序是一种好习惯吗?将 32 位应用程序与 64 位操作系统相结合有什么优点/缺点?

谢谢!

【问题讨论】:

【参考方案1】:

根据实际实现,32 位应用程序需要一些特殊处理才能在 64 位操作系统上运行,而 64 位应用程序将在 64 位操作系统上“本地”运行,因此应该“更好”运行(例如“更好”的各种值 - 例如访问更多内存)。这种“特殊处理”可能只是运行指令集的一个子集,但它需要编组等。

因此,在可用的情况下安装 64 位版本的程序是有意义的。

但是,允许 32 位程序运行具有商业意义,因为 32 位应用程序远多于 64 位应用程序。随着时间的推移,仍在销售的应用程序将被升级,并且未来版本的 Windows 可能会不支持 32 位程序(与 16 位程序一样)。

【讨论】:

@Marcelo - 好吧,“仿真”这个词很糟糕。我会看看我能不能想出更好的东西。【参考方案2】:

两个版本都可以在 64 位操作系统上运行的原因是什么?

如果操作系统无法运行任何旧的(32 位)应用程序,那么没有人愿意使用它。所以他们必须想办法。

在 64 位操作系统上安装 64 位应用程序是一种好习惯吗?

通常是的,它们可以使用更多内存并且运行速度可能会更快一些。但是,64 位应用程序无法调用 32 位 DLL,因此您可能会遇到问题。

将 32 位应用程序与 64 位操作系统相结合有什么优点/缺点?

并非如此,当然它们不能使用超过 4GB 的 RAM,并且运行速度可能比在相同硬件上的 32 位操作系统上运行得慢一些。

【讨论】:

谢谢迈克尔!因此,例如,如果您的计算机上安装了 64 位版本的 Outlook,并且它将从我的(32 位)应用程序中读取 32 位 DLL,那么它可能会触发一些错误...?另外,在64位系统上编译应用程序时,是否也将所有要编译的DLL编译为64位? @Andrei:是的,那行不通。您不能在同一个操作系统进程中混合 64 位和 32 位代码。所以如果你为 64 位操作系统编译你的应用程序,你也必须为 DLL 这样做,我希望 IDE 能做到这一点。 如果您安装了 32 位版本的 Outlook,并且您从我的应用程序中使用了 64 位编译的 DLL,会不会出现同样的问题?【参考方案3】:

使用 x64 等架构的现代处理器可以执行 32 位和 64 位应用程序。

32 位操作系统只能分配 4GB 内存 (2^32 = 4294967296),而 64 位操作系统可以分配更多 (2^64 = 18446744073709551616)。

最好在 64 位操作系统上安装 64 位应用程序,因为如果您的内存超过 4GB,它们将能够使用您计算机的所有内存。

【讨论】:

【参考方案4】:

64 位版本的 Windows 附带一个 Windows on Windows 64 (WOW64) 子系统,允许它运行 32 位应用程序。整个过程实际上非常复杂,您可以在以下位置阅读:

How Windows 7 / Vista 64 Support 32 Bit Applications

如果您有 64 位操作系统并且应用程序供应商提供 64 位版本,请安装它。如果没有,安装 32 位版本不会有什么坏处。

能够在同一台机器上组合 32 位和 64 位应用程序具有明显的优势,因为并非所有供应商都提供其应用程序的 64 位版本。一个允许您同时运行这两者的操作系统将使您能够访问消费者可用的更广泛的软件集。

【讨论】:

【参考方案5】:

并非每个程序都提供 64 位版本。

是的,您通常应该尽可能使用 64 位应用程序。

结合 32 位和 64 位应用程序很痛苦,而且绝不是一个好主意。它通常只在必要时完成(回到我的第一点)。

【讨论】:

@0xA3:那句话的真实性会随着时间而改变。根据您自己的经验,您当然可能不同意,但现在我发现几乎没有理由支持 64 位版本的应用程序的 32 位版本。 我看到的除了兼容性和可能的​​迁移成本之外的主要原因是,由于指针大小增加和对齐/填充不同,64 位应用程序需要更多内存来存储相同数量的数据。这可能会影响处理器缓存利用率,请参阅en.wikipedia.org/wiki/64-bit#Pros_and_cons。所以我的观点是,64 位是否真正有意义取决于您的应用程序。 @0xA3:对于大多数类别的应用程序来说,额外的内存可以忽略不计。我只能重申我的最后一点:这些天来,它几乎不重要了。

以上是关于在64位操作系统上,下面程序返回啥结构的主要内容,如果未能解决你的问题,请参考以下文章

在 64 位操作系统的 64 位 CPU 上运行 X86-64 Python 有啥好处吗?

win7 64位 winmgmt这是啥程序

32位与64位的区别是啥,64位系统有啥优势

32bit和64bit有啥区别?

32位程序在64位系统上获取系统安装时间(要使用KEY_WOW64_64KEY标记)

32位和64位有啥区别 32位和64位区别都有哪些