为什么指针在 64 位和 32 位系统中保持相同的大小?
我最近在计算机上安装了 64 位操作系统,我认为 sizeof(char*)
会给我 8 而不是 4。我不应该在指针中获得 64 位地址吗?
I recently installed a 64bit OS on my computer, I thought that sizeof(char*)
would give me 8 instead of 4. Shouldn't I get a 64 bit addresses in my pointers?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这是因为您使用的编译器正在生成 32 位代码。如果您使用 64 位编译器,则指针将为 8 字节宽。
请注意,大多数 64 位系统都能够在模拟层下运行 32 位代码。在 Windows 上,模拟层称为 WOW64。这显然就是这里正在发生的事情。
This is because the compiler you are using is emitting 32 bit code. If you use a 64 bit compiler then pointers will be 8 bytes wide.
Note that most 64 bit systems have the ability to run 32 bit code under an emulation layer. On Windows the emulation layer is known as WOW64. This is clearly what is happening here.
操作系统通常对代码生成没有影响。如果运行相同的编译器和相同的库,无论操作系统是 32 位还是 64 位,都将得到相同的代码。您可以在 64 位操作系统上编译并运行 32 位软件。您可以在 32 位操作系统上编译 64 位软件。
编译器决定生成的代码类型。操作系统仅决定您是否可以运行它。
The OS typically has no effect on code generation. If you run the same compiler and the same libraries, you will get the same code out, regardless of whether the OS is 32-bits or 64-bits. You can compile and run 32-bit software on a 64-bit OS. You can compile 64-bit software on a 32-bit OS.
The compiler determines the type of code generated. The OS only determines whether you can run it.
是的,您应该这样做,但请注意,同一个操作系统可以同时运行 32 位和 64 位代码,并且在您安装的“64 位操作系统”中,“64 位”可能仅意味着“能够运行 64 位”。
您确实应该在这里提供有关操作系统细节的更多详细信息。例如,Mac OS X Snow Leopard 附带了默认为 64 位代码的 GCC 和 Clang 版本,您可以使用选项
-m32
生成 32 位代码。也许您的 64 位操作系统上的约定相反(也就是说,您应该使用-m64
或类似的选项)Yes, you should, but note that a same operating system can run both 32-bit and 64-bit code, and that in the "64bit OS" you installed, the "64bit" may only mean "64bit able".
You really should give more detail here about the particulars of the OS. Mac OS X Snow Leopard , for instance, comes with versions of GCC and Clang that default to 64-bit code, and you can use option
-m32
to generate 32-bit code. Perhaps the convention is reversed on your 64-bit OS (that is, you should use-m64
or a similar option)