在C(或C ++)中显示简单语句会占用一些内存吗? 例如,
//in C
printf("\nHello World");
//in C++
cout<<"Hello World" ;
并且,如果我附加一个要在同一语句中显示的变量值,它会有所不同吗? 例如,
printf("Value is %d" , var) ;
答案 0 :(得分:5)
代码占用内存。字符串文字占用内存。函数调用(通常)使用一些堆栈。
一般来说,我不认为printf
需要执行任何动态内存分配才能工作。但是,虽然(我相信)有可能避免它,但我不认为他们这样做是不被禁止的。输出具有内置支持的类型时,cout <<
也是如此。如果它最终调用用户定义的重载,那么它可以使用它喜欢的任何内存。
Posix将ENOMEM
列为printf
的可能错误,但不包括snprintf
。这表明在Posix系统上(当然不是所有C实现)输出可能会动态分配内存,但格式化不会。
答案 1 :(得分:4)
在C(或C ++)中显示一个简单的语句会占用一些内存吗?
是的,当然。字符串常量必须存储在某处,通常存储在只读的内存段中。 printf
和cout
设施也会占用空间。
如果我附加一个要在同一个语句中显示的变量值,它会有所不同吗?
是。参数必须存储在某处,通常存储在堆栈中,因此参数使用的内存将在printf
或cout
调用结束后返回。此外,调用本身可能会在调用例程中生成更多指令以推送堆栈上的参数。
答案 2 :(得分:0)
嗯,是的。字符串中的字符需要内存,因此这些对象放在全局内存中,但不放在进程堆中。当调用该函数时,它的参数通过堆栈,然后调用发生。
push offset string "hello, world"
call dword ptr printf
我们的地址由offset
指令计算。所以它使用了堆栈内存的sizeof(uintptr_t)字节。
<强> [UPD。] 强> 这段代码:
int val = 5;
printf("val = %d", val);
反汇编:
mov eax, dword ptr[val]
push eax
push offset string "val = %d"
call dword ptr printf
因此它使用堆栈内存的2 * sizeof(uintptr_t)
个字节。
答案 3 :(得分:0)
另请注意,printf和cout是缓冲写入。如果缓冲区尚未填充输出并且程序退出会触发输出流端口的关闭,则可能无法显示打印字符串。
答案 4 :(得分:0)
如果你的意思是堆内存,那么答案是肯定的(至少在一般情况下)。
我们制作了一些中间件,可以在各种游戏机上运行,包括GCC,visual studio和Metrowerks编译器。游戏行业的一个常见约束是您可能需要分配到自定义堆 - 因此我们必须确保我们的中间件库不进行堆分配(除了明确提供给我们的堆分配器)。所以要确保这一点,我们必须:
这两组调用(通常)都使用堆。 printf(通常)由于使用了格式字符串而需要堆。