知道变量占用多少内存的正确方法是什么
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 4
和 8 8
.
输出的其他可能性
sizeof
将为您提供表示某些 type.In 行对象所需的字节数
std::cout << sizeof(n) << std::endl;
n
是 int
所以这会给你 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 的原因。
我对指针不太熟悉,因为我主要做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 4
和 8 8
.
sizeof
将为您提供表示某些 type.In 行对象所需的字节数
std::cout << sizeof(n) << std::endl;
n
是 int
所以这会给你 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 的原因。