C++ 内存使用估计

C++ 内存使用估计,c++,C++,我想知道变量的内存使用情况,我尝试了以下方法: #include <iostream> int main() { char* testChar1 = "Hi"; char* testChar2 = "This is a test variable"; char* testChar3 = ""; std::cout <<sizeof(testChar1)<<std::endl; std::cout <<s

我想知道变量的内存使用情况,我尝试了以下方法:

#include <iostream>

int main()
{
    char* testChar1 = "Hi";
    char* testChar2 = "This is a test variable";
    char* testChar3 = "";

    std::cout <<sizeof(testChar1)<<std::endl; 
    std::cout <<sizeof (testChar2) <<std::endl; 
    std::cout <<sizeof(testChar3)<<std::endl;
}
我认为我做的事情不对。我想知道每个变量在堆栈中使用了多少内存

编辑1


同时如果我做了
char*testChar3=NULL
;程序崩溃了。那么,这是否意味着没有相同的内存使用?

只要打印指针的大小,它们总是相同的。您需要将字符串的
strlen
乘以单个字符的大小

编辑:根据我的评论和@Suma的更正:

cout << (strlen(testChar) + 1) * sizeof(char) + sizeof(testChar);

cout只要打印指针的大小,它们总是一样的。您需要将字符串的
strlen
乘以单个字符的大小

编辑:根据我的评论和@Suma的更正:

cout << (strlen(testChar) + 1) * sizeof(char) + sizeof(testChar);

cout
sizeof(testChar1)
返回指针大小,如果要测试字符串长度,请尝试将
sizeof
替换为
strlen

sizeof(testChar1)
返回指针大小,如果要测试字符串长度,请尝试将
sizeof
替换为
strlen
除了使用
strlen
,还可以在

char testChar1[] = "Hi";

编辑:是的,这包括空终止符,IMO比strlen有优势。实际大小确实包括空终止符。

除了使用
strlen
,您还可以在

char testChar1[] = "Hi";

编辑:是的,这包括空终止符,IMO比strlen有优势。实际大小不包括空终止符。

在本例中,您只打印指针的大小,而不打印字符。因此,实际上,您需要打印指针,然后取消引用它并打印它指向的内存大小。

在本例中,您只打印指针的大小,而不打印字符。因此,实际上,您需要打印指针,然后取消引用并打印它所指向的内存大小。

您实际上是在打印指针在系统上占用的字节数。我认为你需要做的是使用strlen函数。看看这里


std::cout实际上,您正在打印指针在系统上占用的字节数。我认为你需要做的是使用strlen函数。看看这里

std::cout
程序打印的内容正是您想要的

如果您真正想知道变量指针指向的字符字符串占用了多少内存(其中??!!),请阅读另一个答案

程序打印的内容正是您想要的



如果您真正想知道变量指针指向的字符字符串占用了多少内存(其中??!!),请阅读另一个答案。

这是堆栈或堆在执行时使用的相同计数吗?加上每个字符串的恒定额外内存,在本例中是指针。那么我应该做
strlen(testChar)*sizeof吗(testChar)
?术语
每个字符串的恒定附加内存
指的是@ACB no。您应该执行
strlen(testChar)*sizeof(char)+sizeof(testChar)
@IvayloStrandjev不要忘记终止零。这是堆栈或堆在执行时使用的相同计数吗?加上每个字符串的恒定额外内存,在本例中是指针。我应该执行
strlen(testChar)*sizeof(testChar)吗
?术语
每个字符串的恒定附加内存
指的是@ACB编号。您应该执行
strlen(testChar)*sizeof(char)+sizeof(testChar)
@IvayloStrandjev不要忘记终止零。可能重复或可能设置
char*testChar3=NULL
,然后“读取”/稍后在它仍然为空时访问它将导致空指针异常-这就是程序崩溃的原因。好的,那么这个变量在设置为空时会从堆栈中消失吗?不,是的,有点。你有一个
char
指针。如果你设置
char*
char
指针)如果设置为null,则仍然有一个
char*
;它只是不指向任何内容。此外,打印指针大小时看到
4
的原因是指针由32位(4字节)组成用于32位可执行文件。可能重复或可能设置
char*testChar3=NULL
然后“读取”/稍后在它仍然为空时访问它将导致空指针异常-这就是程序崩溃的原因。好的,那么这个变量在设置为空时会从堆栈中消失吗?不,是的,有点。你有一个
char
指针。如果你设置
char*
char
指针)如果设置为null,则仍然有一个
char*
;它只是不指向任何内容。此外,打印指针大小时看到
4
的原因是指针由32位(4字节)组成对于32位可执行文件,+1@rockstar感谢您的支持+1@rockstar感谢您的支持support@ACB请注意,这包括以null结尾的字符。为什么不
char const wtf[]=“hi”
?@ACB请注意,这包括以null结尾的字符。为什么不
char const wtf[]=“hi”
I want to know how much memory every variable uses in stack .