【问题标题】:Why is sizeof(int) different than sizeof(int*)?为什么 sizeof(int) 与 sizeof(int*) 不同?
【发布时间】:2012-06-14 15:02:49
【问题描述】:

我想知道为什么在以下程序中sizeof(int) 返回的值与sizeof(int*) 不同。

这里是小程序:

int main(){
    std::cout<<sizeof(int)<<endl;
    std::cout<<sizeof(int*)<<endl;
    return 0;
}

这是输出:

4
8

直到现在我记得整数指针的大小是 4byte(gcc 编译器)。如何检查指针的正确大小?是否依赖计算机?

我正在运行 ubuntu 12.04

# lsb_release -a

Distributor ID: Ubuntu 
Description: Ubuntu 12.04 LTS 
Release:    12.04 
Codename:   precise

指针大小是否不固定(标准大小)8字节。

【问题讨论】:

  • 64 位操作系统?
  • @ahenderson- 你确定所有的指针都保证大小相同吗?
  • 仅供参考,没有“标准尺寸”。
  • @ahenderson:指向不同类型的指针不必相同大小。
  • @Oli Charlesworth :我可以在代码中看到一个示例吗?我现在不太确定这个问题。

标签: c++ c sizeof


【解决方案1】:

intint* 的大小完全取决于编译器和硬件。如果您看到 int* 中使用了 8 个字节,则可能是 64 位硬件,这意味着每个指针有 8 个字节。

希望这会有所帮助!

【讨论】:

  • "您可能拥有 64 位操作系统。"确实,但更重要的是,您的进程可能是 64 位进程。 :-)
  • 我想补充一点,唯一由标准定义大小的类型是charsizeof(char) 始终是 1
  • @LihO:char 的大小实际上并没有由标准定义,但sizeof express 是字符数的结果。
  • @K-ballo:我认为这在 C99 之前是正确的,因为 C99 section 6.5.3.4 说:“sizeof 运算符产生其操作数的大小(以字节为单位)”
  • @Liho: 除非他们已经固定了一个字符中的位数(永远不会发生)...char 是一个字节byte 大小是由实现定义的。
【解决方案2】:

sizeof(char) == 1

没有其他保证(*)。

实际上,指针大小在 16 位系统上为 2,在 32 位系统上为 4,在 64 位系统上为 8。


(*) 见 James Kanze 的评论。

【讨论】:

  • sizeof(char) &lt;= sizeof(short) &lt;= sizeof(int) &lt;= sizeof(long) &lt;= sizeof(long long) 也是有保证的。和sizeof(float) &lt;= sizeof(double) &lt;= sizeof(long double) 一样。 (还有一个保证所有尺寸都是完整的,但这或多或少是被理解的。)
  • @JamesKanze 想要迂腐是的,好评论。我试着根据问题和提问者的类型,把答案写得尽可能清楚。
【解决方案3】:

指针的大小取决于系统、编译器和体系结构。在 32 位系统上通常是 32 位,而在 64 位系统上通常是 64 位。

如果您尝试将指针存储到整数中以便以后再次恢复到指针中,您可以使用类型intptr_t,它是一个足够大的整数类型,可以容纳(我相信)普通(非函数)指针类型。

【讨论】:

    【解决方案4】:

    对于 32 位系统,“事实上的”标准是 ILP32 - 即 int, long 和 pointer 都是 32 位的量。

    对于 64 位系统,主要的 Unix“事实上”标准是 LP64 - long 和 pointer 是 64 位的(但 int 是 32 位的)。 Windows 64 位 标准是 LLP64 - long long 和指针是 64 位的(但 long 和 int 都是 32 位的)。

    曾经,一些 Unix 系统使用 ILP64 组织。

    这些事实上的标准都不是由 C 标准立法的 (ISO/IEC 9899:1999),但一切都被它所允许。

    如果您关心可移植性,或者您想要 type反映了大小,可以看header,在哪里 以下宏可用:

    int8_t int16_t int32_t int64_t

    int8_t保证8位,int16_t保证16位 位等。

    看到这个question

    【讨论】:

    • 不保证int8_t等存在。为了获得最大的可移植性,只需使用int,除非您知道自己需要更大的东西,并验证您的输入。
    • @JamesKanze:??? 是相当标准的。 pubs.opengroup.org/onlinepubs/9699919799/basedefs/…
    • @OAOD &lt;stdint.h&gt; 是标准 C 和 C++ 标头,其中定义了这些类型,在 &lt;stdint.h&gt;int8_t 等中。被标记为可选。在 C 标准中,如果硬件支持它们,我认为它们是“必需的”;无论如何,这就是意图。但它们必须是精确大小的类型,并且带符号的类型必须是 2 的补码。在没有 8 位字节或不是 2 的补码的机器上,它们不会被定义。 (Posix 需要它们,这限制了它可以实现的硬件。)
    • @JamesKanze:感谢您的洞察力。
    猜你喜欢
    • 2013-09-24
    • 2017-03-26
    • 2011-03-07
    • 2021-05-12
    • 2013-02-19
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多