【问题标题】:What is the proper way to know how much memory is occupied by a variable知道变量占用多少内存的正确方法是什么
【发布时间】:2015-12-16 13:20:15
【问题描述】:

我对指针不是很熟悉,因为我主要做java,而java没有指针,现在我正在学习C++。在C++教程中,为了知道变量占用的内存大小,导师在指向变量的指针上使用了size of,即

    int v = 23;
    int *p = &v;

    cout << sizeof(p) << endl;

这让我很困惑,因为在第一年我学习的是 C 编程,我需要对变量本身执行 sizeof。所以我首先得出结论,他们的意思是一样的。但是当我在我的电脑上尝试时,我得到了不同的结果。我有以下代码...

    #include <iostream>

    int main()
    {
            int *ptr = new int;
            int n = 23;

            ptr = &n;

            std::cout << sizeof(n) << std::endl;
            std::cout << sizeof(ptr) << std::endl;

            return 0;
    }

当我运行上面的代码时,我得到了 4 和 8 的输出。但是我的朋友在他的机器上编译并执行了相同的代码,他得到了 4 和 4 的输出。我不知道为什么会这样,并且为什么导师在指向变量的指针上使用 sizeof 而不是变量本身,因为他想知道该变量占用的内存量。我知道 C/C++ 中的变量由于架构不同而具有不同的内存容量,至少这是我在 C 中所学的。64 位机器中的 int 与 32 位机器上的大小不同。但我虽然我的结果必须至少一致,即 8 和 8,或 4 和 4。我使用的是 64 位架构和 64 位操作系统,我的朋友使用的是 64 位架构和 32 位操作系统。

【问题讨论】:

  • “java 没有指针” - 事实并非如此。 Java 到处都有指针,比您在现代 C++ 中所能找到的要多得多,包括所有那些非常乏味的空检查和违反快速失败原则的行为。 Java 只是倾向于将其指针称为“引用”,NullPointerException 除外。 Java 没有 C++ 引用。
  • 我理解你所说的 java 有指针但只是称它们为引用的意思。但是这样说可能会误导一些 C/C++ 程序员。他们可能会开始考虑指针算术、尊重等。我可能错了,但我知道 java 不会做任何这些。但我什至知道什么:-)stackoverflow.com/questions/2629357/does-java-have-pointers

标签: c++ pointers sizeof


【解决方案1】:

在您的代码中,

 cout << sizeof(p) << endl;

为您提供变量p 的大小,它的类型为int *

相同
cout << sizeof(*p) << endl;

cout << sizeof(int) << endl;

这将为您提供int 变量占用的大小。

话虽如此,澄清一下,要了解变量占用的大小,您需要对该变量使用sizeof 运算符,而不是指向该变量的指针。 (你在第一年学到的东西正确的)。

注意,指针的大小取决于架构,因此它可能会有所不同。在某些架构中,指针的大小可以是 32 位(sizeof 将返回 4),在其他一些架构中可以是 64 位(sizeof 将返回 8)。

【讨论】:

    【解决方案2】:

    您必须对值本身使用sizeof 才能知道该变量占用了多少内存。我认为导师做错了。

    int v = 23;
    int a[5] = {0, 1, 2, 3, 4};
    int *p = &v;
    
    cout << sizeof(p) << endl; // print the size of int*
    cout << sizeof(*p) << endl; // print the size of int
    cout << sizeof(v) << endl; // print the size of int
    
    p = a;
    cout << sizeof(p) << endl; // print the size of int*
    cout << sizeof(*p) << endl; // print the size of int
    cout << sizeof(a) << endl; // print the size of int[5]
    

    【讨论】:

    • 非常感谢。这就是我从 youtube 学习必须付出的代价。
    • 获取good book。 Youtube 是猫的视频,而不是学习 C++。
    【解决方案3】:

    sizeof(ptr) 给出指针ptr 的大小,其大小由实现定义。 sizeof(int) 也是如此。这就是您和您的朋友得到不同结果的原因。
    您可能会得到输出为4 48 8 的其他可能性。

    【讨论】:

    • sizeof(int) 也会因环境而异。
    【解决方案4】:

    sizeof 将为您提供表示特定类型对象所需的字节数。在您的行中 std::cout &lt;&lt; sizeof(n) &lt;&lt; std::endl; nint 所以这会给你什么是 int 变量的大小。
    std::cout &lt;&lt; sizeof(ptr) &lt;&lt; std::endl;ptr 是指向整数的指针类型,因此这将为您提供int* 的大小。它们的值不能保证相同,并且在不同的架构上都会独立变化。 c++ 标准没有说明这些类型的大小应该是多少。

    来自 N 3690 标准草案:

    "sizeof 运算符在其操作数的对象表示中产生字节数。操作数是 要么是一个表达式,它是一个未计算的操作数(第 5 条),要么是一个带括号的 type-id。 sizeof 运算符不应应用于具有函数或不完整类型的表达式,应用于枚举类型 在声明所有枚举数之前,其基础类型未固定到运行时数组 绑定到此类类型的带括号的名称,或指定位域的泛左值。 sizeof(char), sizeof(signed char)sizeof(unsigned char) 是 1。sizeof 的结果应用于任何其他 基本类型(3.9.1)是实现定义的。”

    【讨论】:

      【解决方案5】:

      对于编译器,所有指针都具有固定大小,与数据类型无关。 32位计算机指针大小为4字节,64位计算机指针大小为8字节。这就是你朋友的指针大小为 4 而你的指针大小为 8 的原因。

      【讨论】:

        猜你喜欢
        • 2022-11-22
        • 2011-10-24
        • 1970-01-01
        • 2011-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-28
        • 1970-01-01
        相关资源
        最近更新 更多