【问题标题】:What to watch out for when writing 32-bit software on 64-bit machine?在 64 位机器上写 32 位软件时要注意什么?
【发布时间】:2010-09-15 23:11:33
【问题描述】:

我正在购买一台舒适的笔记本电脑进行开发,但我唯一可用的操作系统是 64 位(Win7),现在我基本上知道 64 位具有 8 字节整数并且可以使用更多 RAM,大约它。

我的编程会有所不同(C++,有时是 PHP),但想知道:

  • 我能否将我的 C++ 应用程序构建为 32 位可移植的(在 32 位计算机上运行而无需在 32 位虚拟机下构建?)
  • 编写应用程序时需要注意哪些简单的问题(转换等)

【问题讨论】:

    标签: c++ 64-bit compatibility portability


    【解决方案1】:

    处理器一直是 64 位的。我很困惑为什么人们害怕转向 64 位操作系统。 32 位操作系统不能处理超过 3Gb 的 RAM,所以这足以让我在书中进行升级!

    在编码时,我遇到的最大差异是指针的大小!

    在 32 位编译程序中,指针通常为 4 个字节。在 64 位编译的程序上,一个指针通常是 8 个字节。

    为什么这很重要?

    假设您的程序使用套接字将数据结构从一个进程传递到另一个进程。可能服务端进程是32位,客户端进程是64位。

    虽然结构可能在 32 位和 64 位程序中定义相同,但 64 位 exe 将为每个指针保留 8 个字节(结构通常包含指向其他结构的指针,如链表等)。

    当 32 位 exe 与 64 位 exe 通信结构时,这可能会导致数据错位。

    在(几乎?)所有情况下,进程之间的指针值通信无论如何都是没有意义的,例如他们的数据无关紧要,可以省略。

    所以你可能认为传递指针值是一种不常见的做法 - 但传递结构的简单方法是通过套接字、指针和所有内容来存储其内容!

    这是迄今为止我发现的最严重的问题,在编写 64 位客户端时,当我们的服务器软件是 32 位时。

    【讨论】:

    • 我很高兴它这么简单,我肯定会插入一个虚拟机并在两个拱门之间进行一些测试,看看是否可以方便地使用差异进行编码,那就是我敢肯定!
    • @John 没那么简单。例如,在 32 位机器上,最大整数值远低于 64 位机器。这通常会导致难以调试的问题。
    • 一个简单的示例程序将证明否则 OTZ。编写一个输出 sizeof(int) 的简单程序,然后在 32 位和 64 位架构上编译它。那会告诉你区别。你会发现它们都是一样的。两种架构的唯一区别是指针大小。
    • @user,这取决于您使用的是哪个 64 位 data model。主要的确实有 32 位整数,但不是全部。
    【解决方案2】:

    最简单的事情是简单地构建一个 32 位可执行文件。使用 Visual Studio,只需选择 Win32 作为构建类型。对于 gcc,请使用 -m32 开关。

    【讨论】:

    • 此外,直到 VS 2008,没有任何预定义的 Win64 设置。您必须手动设置它。 32位是正常的。
    【解决方案3】:

    专门针对windows的,看看WOW64的msdn文档。 Windows 64 位在模拟器中运行 32 位应用程序,因此您可以为您的系统构建运行 32 位应用程序。这对您的应用有一些(相当积极的)影响,例如您的进程的虚拟地址空间增加了,因为操作系统可能使用更高的 64 位地址,您的 32 位进程甚至都不知道。

    MSVC++ 数据类型大小也记录在MSDN 上。但是如果你担心铸造,你应该使用更大的类型,这肯定会满足你的需要。 C++ 标准没有定义类型的 exact 大小(afaik),只定义它们的相对大小(short 比 int 短,等等)。所以,你不能依赖这些类型的确切大小,除非你使用一些明显不会改变 64 位应用程序的 int32 或 __int32。

    【讨论】:

      【解决方案4】:

      交叉编译(针对不同的平台、指针大小、字节顺序等)已经存在了很长时间,只要您使用正确的工具和标志来构建您的 32 位可执行文件,构建平台真的无关紧要.

      如果是 Microsoft 编译器,它应该像启动 Visual Studio 并使用默认的“Win32 配置”编译程序一样简单。如果您更喜欢命令行,请务必通过调用Visual Studio 命令提示符(相对于 x64 版本)。

      顺便说一句,如果您运行的是 64 位 Enterprise Server,您可以打开 Hypervisor Role,在虚拟机中安装 32 位 Win7 并实际测试您构建的程序。最后,在将要执行的实际目标平台上测试程序总是一个好主意:)...

      【讨论】:

        猜你喜欢
        • 2015-04-02
        • 2017-02-16
        • 2014-12-16
        • 2014-05-08
        • 2011-08-08
        • 2011-04-09
        • 1970-01-01
        • 2011-09-04
        • 1970-01-01
        相关资源
        最近更新 更多