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

What is the proper way to know how much memory is occupied by a variable

我对指针不太熟悉,因为我主要做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,因为他想知道该变量占用的内存量。我知道 C/C++ 中的变量由于不同的体系结构而具有不同的内存容量,至少这是我在 C 中学到的。64 位机器中的 int 与 32 位机器中的 int 具有不同的大小。但是我虽然我的结果必须至少是一致的,即 8 和 8,或者 4 和 4。我使用 64 位架构和 64 位 OS,我的朋友使用 64 位架构和 32 位 OS.

在您的代码中,

 cout << sizeof(p) << endl;

给出变量 p 的大小,其类型为 int *.

不同

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

cout << sizeof(int) << endl;

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

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

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

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

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

输出的其他可能性

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

来自N 3690标准草案:

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

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