C++ 指针元数据存储在哪里?

C++ 指针元数据存储在哪里?,c++,pointers,metadata,C++,Pointers,Metadata,可能我忽略了一些显而易见的东西,但指针元数据存储在哪里?例如,如果我有一个32位的int指针ptr,我执行ptr++,它知道在内存中前进4个字节。然而,如果我有一个64位的int指针,它就知道前进8字节。那么,谁来跟踪指针ptr的类型及其存储位置呢?为简单起见,可以将其限制为C++。 < p>它本身不存储任何地方。编译器查看ptr的类型,并在编译器运行时将++操作转换为正确字节数的增量。中的。当你的程序运行时,任何地方都没有,或者更确切地说,它隐含在编译器生成的低级代码中。它不存储在任何地方,而

可能我忽略了一些显而易见的东西,但指针元数据存储在哪里?例如,如果我有一个32位的int指针
ptr
,我执行
ptr++
,它知道在内存中前进4个字节。然而,如果我有一个64位的int指针,它就知道前进8字节。那么,谁来跟踪指针
ptr
的类型及其存储位置呢?为简单起见,可以将其限制为C++。

< p>它本身不存储任何地方。编译器查看ptr的类型,并在编译器运行时将++操作转换为正确字节数的增量。

中的。当你的程序运行时,任何地方都没有,或者更确切地说,它隐含在编译器生成的低级代码中。

它不存储在任何地方,而是在编译时确定的。事实上,以这段代码为例:

int *abc = NULL;
cout << abc + 1; /* Prints sizeof(int) */
cout << (void *)((char *)abc + 1); /* Prints 1. Casting it back to void * is necessary,
           otherwise it will try to dereference it and print as a string. */
int*abc=NULL;

简短的回答:魔法。长答案,它不需要存储在任何地方,因为编译器可以在编译时执行请求的指针算法。好的,您应该将其作为答案发布。这很好。从常见问题解答“没有问题太琐碎或太“新手”来看,[n00b]标记是不必要的,而且在任何情况下都拼写错误。呃,我想这是唯一的n00b标记的原因。我很好奇为什么你认为它拼错了。除了几个(我的意思是几个)用户名,你不会在这里找到太多的leetspeak。这种文化更多地是为了认真的专业程序员和计划成为专业程序员的学生。谢谢。我甚至没有想到它可以在编译时计算出来。