C++ 我能依靠';尺寸';以确定I';我使用32位操作系统或64位操作系统
假设我不确定如何检查正在运行的操作系统 因此,我想使用以下代码确定:C++ 我能依靠';尺寸';以确定I';我使用32位操作系统或64位操作系统,c++,c,32bit-64bit,virtual-memory,C++,C,32bit 64bit,Virtual Memory,假设我不确定如何检查正在运行的操作系统 因此,我想使用以下代码确定: #include <limits.h> ... size_t os_size = sizeof(void*) * CHAR_BIT; #包括 ... size\u t os\u size=sizeof(void*)*CHAR\u位; 我可以100%依赖它吗?或者有什么需要注意的注意事项吗 例如: 我是否可能安装了32位操作系统的编译器,并且可以在64位操作系统上正常工作 谢谢没有。 正如您已经提到的,您可以在6
#include <limits.h>
...
size_t os_size = sizeof(void*) * CHAR_BIT;
#包括
...
size\u t os\u size=sizeof(void*)*CHAR\u位;
我可以100%依赖它吗?或者有什么需要注意的注意事项吗
例如:
我是否可能安装了32位操作系统的编译器,并且可以在64位操作系统上正常工作
谢谢没有。
正如您已经提到的,您可以在64位操作系统上使用32位编译器。在Linux上还有一个更有趣的例子叫X32 ABI,其中应用程序是32位的特例,但支持本机64位寄存器、本机64位数学等等。否。
正如您已经提到的,您可以在64位操作系统上使用32位编译器。在Linux上还有一个更有趣的例子叫X32 ABI,其中应用程序是32位的特例,但支持本机64位寄存器、本机64位数学等等。理论上,您可以使用C实现,其中
char
为32位,而sizeof(char)
=sizeof(int)
=sizeof(long)
=1,并且可能sizeof(long-long)
=2;IIRC在公共Lisp中的一些C的实验实现(或者可能只是SBCL)也在做类似的事情。遗憾的是,我忘记了细节
在实践中,最好使用
给出int32\u t
、int64\u t
和intptr\u t
,以便sizeof(intptr\t)
=sizeof(void*)
所以答案是否定的
您可以使用
和INT\u MAX
等
你可以有一个交叉编译器。。。。(例如,在Linux x86-64桌面上编译32位ARM安卓平板电脑,并带有十字)
您可能需要使用以下内容。了解。也许您想要\uuu LP64\uuuu
您可能有一个在x86-64上支持64位的Linux操作系统,但它运行在chroot
-ed环境(或containerála docker)中,提供32位环境(32位libc、32位编译器等)。这实际上很有用(例如,在64位Linux笔记本电脑上测试您的应用程序是否可以在32位上编译和执行)。见例。而且大多数Linux x86-64系统能够运行32位x86 ELF二进制文件(至少如果它们是静态链接的)。顺便说一句,在我的Linux/Debian/x86-64系统上,gcc-m32
生成32位的对象文件和可执行文件,但gcc-m64
或只是gcc
给出64位
在POSIX系统上,要了解您的机器,请使用。在Linux上,您甚至可以读取和解析/proc/cpuinfo
(以及/proc/
下的一些其他文件,请参阅)
我对Windows一无所知。如果您正在使用它,您应该尝试一下Linux。理论上,您可以使用C实现,其中
char
为32位,sizeof(char)
=sizeof(int)
=sizeof(long)
=1,可能sizeof(long)
=2;IIRC在公共Lisp中的一些C的实验实现(或者可能只是SBCL)也在做类似的事情。遗憾的是,我忘记了细节
在实践中,最好使用
给出int32\u t
、int64\u t
和intptr\u t
,以便sizeof(intptr\t)
=sizeof(void*)
所以答案是否定的
您可以使用
和INT\u MAX
等
你可以有一个交叉编译器。。。。(例如,在Linux x86-64桌面上编译32位ARM安卓平板电脑,并带有十字)
您可能需要使用以下内容。了解。也许您想要\uuu LP64\uuuu
您可能有一个在x86-64上支持64位的Linux操作系统,但它运行在chroot
-ed环境(或containerála docker)中,提供32位环境(32位libc、32位编译器等)。这实际上很有用(例如,在64位Linux笔记本电脑上测试您的应用程序是否可以在32位上编译和执行)。见例。而且大多数Linux x86-64系统能够运行32位x86 ELF二进制文件(至少如果它们是静态链接的)。顺便说一句,在我的Linux/Debian/x86-64系统上,gcc-m32
生成32位的对象文件和可执行文件,但gcc-m64
或只是gcc
给出64位
在POSIX系统上,要了解您的机器,请使用。在Linux上,您甚至可以读取和解析/proc/cpuinfo
(以及/proc/
下的一些其他文件,请参阅)
我对Windows一无所知。如果您正在使用它,您应该尝试一下Linux。在任何情况下,它都可能只知道编译器的目标是什么,这与它实际运行的目标无关。@harold:所以指针的大小只是指示我的编译器(而不是我的操作系统)支持的虚拟内存大小闻起来像XY问题。结果值(假设是准确的)将如何使用?@SergeyA,因为OP想知道他现在使用的是什么操作系统,如果操作系统支持在多个内存模型中运行进程,这将有什么帮助?编写一个程序来解决这个问题只会告诉你程序是如何编译的。在任何情况下,它的可能副本都可能只知道编译器的目标,而这与它实际运行的目标无关。@harold:所以指针的大小只指示我的编译器支持的虚拟内存的大小(而不是我的操作系统)?闻起来像XY问题。结果值如何(假设它是准确的)是否将被使用?@SergeyA,因为OP想知道他现在使用的是什么操作系统,如果操作系统支持在多个内存模型中运行进程,这会有什么帮助?编写一个程序来解决这个问题只会告诉你程序是如何编译的。好的,知道了,谢谢。我将等待你的answe的更多评论/答案/投票r为了确定,谢谢