知道变量占用多少内存的正确方法是什么

时间:2015-12-16 13:20:16

标签: c++ pointers sizeof

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

    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而不是在变量本身上使用sizeof,因为他想知道该变量占用的内存量。我知道C / C ++中的变量由于不同的体系结构而具有不同的内存容量,至少这是我在C中所教授的.64位机器中的int与32位机器上的int有不同的大小。但我虽然我的结果必须至少是一致的,即8和8,或4和4.我使用的是64位架构和64位操作系统,我的朋友正在使用64位架构和32位操作系统。

5 个答案:

答案 0 :(得分:10)

在您的代码中,

 cout << sizeof(p) << endl;

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

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

cout << sizeof(int) << endl;

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

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

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

答案 1 :(得分:3)

您必须对值本身使用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]

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

根据N 3690标准草案:

&#34; sizeof运算符产生其操作数的对象表示中的字节数。操作数是 表达式,它是未评估的操作数(第5条)或带括号的type-id。 sizeof operator不应用于枚举类型的具有函数或类型不完整的表达式 在声明所有枚举数之前,其基础类型不是固定的,而是运行时数组 绑定到这些类型的带括号的名称,或指定位字段的glvalue。 sizeof(char)sizeof(signed char)sizeof(unsigned char)是1. sizeof应用于任何其他的结果 基本类型(3.9.1)是实现定义的。&#34;

答案 4 :(得分:0)

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