在C代码中,如
printf("%s", message);我想知道我是否应该用
fputs(message, stdout);以前的代码更清晰,但速度慢吗?或者使用更多的内存?我更喜欢更清晰的代码,但当它看起来像是在愚蠢地浪费时间和内存时,我就不喜欢了。
我想知道编译器检测到了这样的情况,并且没有在运行时完成必要的格式解析和解释。毕竟,gcc在printf("")上抱怨,所以编译器可以“理解”格式并对其进行预处理。
PS:在编写format("name=%s\n",unameData.nodename);而不是fputs(stdout,"name=");fputs(stdout,unameData.nodename);putchar('\n');时,前者的风格更加清晰。这毕竟是有格式的目的。
发布于 2014-12-30 11:31:35
取决于实现,其中一种或另一种可能更有效。
使用适当的优化标志,体面的编译器应该能够在程序员不知情的情况下将效率较低的形式转换为另一种形式(假设为printf("%s\n", message))。
$ cat print.c
#include <stdio.h>
int main()
{
printf("%s\n", "Hello world");
return 0;
}
$ gcc -S -O2 print.c
$ cat print.s
.file "print.c"
.section .rodata.str1.1,"aMS",@progbits,1
.LC0:
.string "Hello world"
...
movl $.LC0, (%esp)
call puts
xorl %eax, %eax
leave
......表示为简洁而省略的代码。
发布于 2014-12-30 11:40:51
虽然理论上这两种方法都是正确的,但在实践中,printf函数几乎总是有更高的成本:
printf函数是变量参数函数,它限制了调用约定编译器可以使用的调用约定。这会导致更多的程序内存使用,因为清理总是在调用方代码上。代码也可能慢一些,因为参数必须传递到堆栈上而不是寄存器上。printf函数的复杂性,这些函数往往具有更高的堆栈使用率。虽然一些编译器可能会在可能的情况下检测printf并使用puts,但在实践中,用于嵌入式系统的编译器并不总是那么聪明,而且在这种环境中,差别非常重要。
https://stackoverflow.com/questions/27704547
复制相似问题