首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fputs是否比格式(“%s”,.)更有效?

fputs是否比格式(“%s”,.)更有效?
EN

Stack Overflow用户
提问于 2014-12-30 11:23:48
回答 2查看 317关注 0票数 3

在C代码中,如

代码语言:javascript
复制
printf("%s", message);

我想知道我是否应该用

代码语言:javascript
复制
fputs(message, stdout);

以前的代码更清晰,但速度慢吗?或者使用更多的内存?我更喜欢更清晰的代码,但当它看起来像是在愚蠢地浪费时间和内存时,我就不喜欢了。

我想知道编译器检测到了这样的情况,并且没有在运行时完成必要的格式解析和解释。毕竟,gccprintf("")上抱怨,所以编译器可以“理解”格式并对其进行预处理。

PS:在编写format("name=%s\n",unameData.nodename);而不是fputs(stdout,"name=");fputs(stdout,unameData.nodename);putchar('\n');时,前者的风格更加清晰。这毕竟是有格式的目的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-30 11:31:35

取决于实现,其中一种或另一种可能更有效。

使用适当的优化标志,体面的编译器应该能够在程序员不知情的情况下将效率较低的形式转换为另一种形式(假设为printf("%s\n", message))。

代码语言:javascript
复制
$ 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
    ...

...表示为简洁而省略的代码。

票数 5
EN

Stack Overflow用户

发布于 2014-12-30 11:40:51

虽然理论上这两种方法都是正确的,但在实践中,printf函数几乎总是有更高的成本:

  • printf函数是变量参数函数,它限制了调用约定编译器可以使用的调用约定。这会导致更多的程序内存使用,因为清理总是在调用方代码上。代码也可能慢一些,因为参数必须传递到堆栈上而不是寄存器上。
  • 由于printf函数的复杂性,这些函数往往具有更高的堆栈使用率。

虽然一些编译器可能会在可能的情况下检测printf并使用puts,但在实践中,用于嵌入式系统的编译器并不总是那么聪明,而且在这种环境中,差别非常重要。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27704547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档