为什么我在32位Mac OS X系统上看到C++中的64位指针?

Bre*_*ode 1 c++ macos x86 pointers

所以我在SO和其他地方阅读了很多相关的帖子,例如:

sizeof(某些指针)总是等于4吗?

对我来说,在32位系统上,我期望4字节指针,在64位系统上,我期望8字节指针.所以我正在运行这段代码:

int main()
{
  cout << "sizeof(int) = " << sizeof(int) << endl;
  cout << "sizeof(void*) = " << sizeof(void*) << endl;
}
Run Code Online (Sandbox Code Playgroud)

这是相应的输出:

sizeof(int) = 4
sizeof(void*) = 8
Run Code Online (Sandbox Code Playgroud)

我在Mac OS X 10.6.1上以32位模式运行.这是"uname -a"的输出:

Darwin brent-nashs-macbook.local 10.0.0 Darwin Kernel Version 10.0.0: Fri Jul 31 22:47:34 PDT 2009; root:xnu-1456.1.25~1/RELEASE_I386 i386 i386
Run Code Online (Sandbox Code Playgroud)

这是我正在运行的g ++版本(系统附带的默认版本):

i686-apple-darwin10-g++-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5646)
Run Code Online (Sandbox Code Playgroud)

所以我意识到指针的大小不能保证从系统到系统,并且它们完全依赖于编译器和体系结构,但这种结果是否会使其他人感到不合逻辑呢?这只是Mac OS X 10.6或我的设置的特质吗?还是有一个很好的理由我看到这么大的指针?

==================================================

答案后补充

任何想要他们的人的额外细节......

我最初使用此命令行编译:

g++ -Wall -o TestClass1 TestClass1.cpp
Run Code Online (Sandbox Code Playgroud)

它产生了这个输出:

sizeof(int) = 4
sizeof(void*) = 8
Run Code Online (Sandbox Code Playgroud)

在下面的建议之后,我将命令行更改为:

g++ -Wall -o TestClass1 -arch i386 TestClass1.cpp 
Run Code Online (Sandbox Code Playgroud)

输出变为:

sizeof(int) = 4
sizeof(void*) = 4
Run Code Online (Sandbox Code Playgroud)

Ste*_*non 7

您正在运行32位内核,但您正在将代码编译为64位可执行文件.无论使用哪个内核,32位和64位代码都可以在OS X中运行.

如果要将代码编译为32位可执行文件,请将-arch i386标志传递给gcc.64位的相应标志是-arch x86_64,但它是Snow Leopard的默认值.