【问题标题】:sizeof a pointer指针大小
【发布时间】:2013-03-21 02:04:37
【问题描述】:
int i=0;
int *p = &i;
std::cout<<sizeof(i)<<" vs "<<sizeof(p)<<"\n";

char c='0';
char*pc = &c;
std::cout<<sizeof(c)<<" vs "<<sizeof(pc)<<"\n";

double d=0.123456789;
double *pd = &d;
std::cout<<sizeof(d)<<" vs "<<sizeof(pd)<<"\n";

为什么指针的大小总是等于4的整数?

【问题讨论】:

  • 在64位上试一试,你会发现不一样。 :)
  • 这是一个奇怪的问题;你知道什么是指针吗?为什么你会期望它有不同的大小?
  • C++ 社区非常庞大,只有一个简单的问题,但我很快就会收到很多回复。高兴的!谢谢。

标签: c++ sizeof


【解决方案1】:

指针不包含它们指向的数据。

指针只是指向它们指向的数据。

sizeof( double* ) 是用于描述double 所在位置的数据大小。就像一张写有房子地址的纸在房子更大或更小时不会改变大小一样,指针的大小不是指向数据大小的函数。

嗯,通常。您可以想象国际地址更长,并且需要更多纸张。类似地,您可以想象与其他地址相比,公寓大楼内的地址需要多行“单元号”,甚至“公寓内”地址包含“单元号”,因此更短。该标准允许指向各种类型的指针的大小有所不同,并且某些架构(最著名的是 8086)具有近指针和远指针的概念(分别为 16 位和 32 位)。

这不再常见(除了成员函数指针,但它们有多常见?)

【讨论】:

  • 喜欢你提到的寻址示例!
【解决方案2】:

指针实际上是一个包含地址的变量。在 32 位机器上,地址总是 32 位的,所以它是 4 个字节。 16 位或 64 位机器的逻辑相同。

刚刚查看了 C99 标准,它说:

指针的大小不一定与任何指针的大小相同 整数类型。一个实现可以支持多个大小的 指针。

嗯,因此我认为知道指针大小的最安全方法是sizeof()

【讨论】:

  • 它可能不包含地址。例如,在某些架构上,它会包含段偏移量。
  • 嗯,感谢您指出这一点,您是在提到远指针吗?
  • 在某些架构上可能存在近/远指针的概念,是的。但这不是标准讨论的内容。该标准对指针提出了要求,迫使它们以类似内存地址的方式运行。但它绝不要求存储在指针中的值与目标机器上的物理存储位置之间存在任何关系。
【解决方案3】:

因为这是一个指针占用的内存量:4 个字节。

如果这是一个 64 位应用程序,它将返回 8。

【讨论】:

    【解决方案4】:

    指针的大小取决于您正在编译的应用程序的类型。

    指针类似于 32 位应用程序中的 32-bit unsigned int,因为它存储内存位置。

    如果应用程序是N-bit 应用程序,则任何指针的大小都将为N bits 长,因为它需要足够大以存储内存位置。

    任何可以运行N-bit 应用程序的N-bit 计算机的RAM 限制为2^N bytes。这使得最大的内存位置 id 等于2^N - 1(因为0x00000000 是一个有效的内存地址)。

    2^N - 1 要求 N bits 用二进制表示,我的朋友就是为什么在 32 位应用程序中指针的大小为 4 字节。

    为简单起见,以3-bit 应用程序为例:(我宁愿不处理大量数字)

    假设它在3-bit 机器上运行。由于2^3 - 1 是可以用3 bits 以二进制形式表示的最大数字,因此系统可以处理的最大内存将是2^3 字节。 (这些是无符号的。负内存地址不存在)

    可能的内存地址是:

    • 0x0(二进制表示:000
    • 0x1(二进制表示:001
    • 0x2(二进制表示:010
    • 0x3(二进制表示:011
    • 0x4(二进制表示:100
    • 0x5(二进制表示:101
    • 0x6(二进制表示:110
    • 0x7(二进制表示:111

    因此,在这种情况下,指向内存地址的指针需要有3 bits

    3 替换为32,这将适用于您在这里所做的事情。

    (矫枉过正的回答很多?是的。为什么?因为我很无聊。)

    【讨论】:

    • 并非总是如此。但大多数时候都是真的。当然不是标准规定的。例如,它可能包含某些架构上的段偏移量,它可能小于物理机的地址空间。
    • 当然可以,但我认为没有人愿意处理这种特殊情况:p(幸好没有 /sane/ 程序员必须这样做)
    • 没错,没有人愿意处理特殊情况。但在某些情况下,为了正确理解,特殊情况是必要的。 C 和 C++ 对指针提出了要求,迫使它们“类似地址”——但不要求指针存储的数据与底层机器的物理内存寻址模型之间存在任何关系。
    猜你喜欢
    • 1970-01-01
    • 2011-04-20
    • 2015-05-03
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多