来源:明日科技
当我们讨论指针时,通常假设它是一种可以用void *指针来表示的东西,在 x86_64 平台下是 8 个字节大小。例如,下面是来自 维基百科中关于 x86_64 的文章 的摘录:
Pushes and pops on the stack are always in 8-byte strides, and pointers are 8 bytes wide.
从 CPU 的角度来看,指针无非就是内存的地址,所有的内存地址在 x86_64 平台下都是由 64 位来表示,所以假设它是 8 个字节是正确的。通过简单输出不同类型指针的长度,这也不难验证我们所说的。
#include
int main() {
std::
cout <<
"sizeof(int*) == " <<
sizeof(
int*) <<
"\n"
"sizeof(double*) == " <<
sizeof(
double*) <<
"\n"
"sizeof(void(*)()) == " <<
sizeof(
void(*)()) <<
std::
endl;
}
编译运行上面的程序,从结果中可以看出所有的指针的长度都是 8 个字节:
$ uname -i
x86_64
$ g -Wall ./example.cc
$ ./a.
out
sizeof(
int*) ==
8
sizeof(
double*) ==
8
sizeof(
void(*)()) ==
8 然而在 C 中还有一种特例——成员
函数的指针。很有意思吧,成员
函数指针是其它任何指针长度的两倍。这可以通过下面简单的程序来验证,输出的结果是 “16”:
#include
struct Foo {
void bar()
const { }
};
int main() {
std::
cout <<
sizeof(
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。