printf()的内存消耗

时间:2013-12-05 19:09:38

标签: c++ c

在C(或C ++)中显示简单语句会占用一些内存吗? 例如,

//in C
printf("\nHello World");
//in C++
cout<<"Hello World" ;

并且,如果我附加一个要在同一语句中显示的变量值,它会有所不同吗? 例如,

printf("Value is %d" , var) ; 

5 个答案:

答案 0 :(得分:5)

代码占用内存。字符串文字占用内存。函数调用(通常)使用一些堆栈。

一般来说,我不认为printf需要执行任何动态内存分配才能工作。但是,虽然(我相信)有可能避免它,但我不认为他们这样做是不被禁止的。输出具有内置支持的类型时,cout <<也是如此。如果它最终调用用户定义的重载,那么它可以使用它喜欢的任何内存。

Posix将ENOMEM列为printf的可能错误,但不包括snprintf。这表明在Posix系统上(当然不是所有C实现)输出可能会动态分配内存,但格式化不会。

答案 1 :(得分:4)

  

在C(或C ++)中显示一个简单的语句会占用一些内存吗?

是的,当然。字符串常量必须存储在某处,通常存储在只读的内存段中。 printfcout设施也会占用空间。

  

如果我附加一个要在同一个语句中显示的变量值,它会有所不同吗?

是。参数必须存储在某处,通常存储在堆栈中,因此参数使用的内存将在printfcout调用结束后返回。此外,调用本身可能会在调用例程中生成更多指令以推送堆栈上的参数。

答案 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编译器。游戏行业的一个常见约束是您可能需要分配到自定义堆 - 因此我们必须确保我们的中间件库不进行堆分配(除了明确提供给我们的堆分配器)。所以要确保这一点,我们必须:

  • drop print to print,vsprintf,...
  • 放弃使用C ++流

这两组调用(通常)都使用堆。 printf(通常)由于使用了格式字符串而需要堆。