fputs比格式("%s",...)更有效吗?

phs*_*phs 3 c format stdio

在C代码中

printf("%s", message);
Run Code Online (Sandbox Code Playgroud)

我想知道我是否应该使用

fputs(message, stdout);
Run Code Online (Sandbox Code Playgroud)

前面的代码更清晰但速度更慢?或者使用更多内存?我更喜欢更清晰的代码,但当它看起来像浪费时间和内存时更糟糕.

我很想知道编译器检测到这种情况,并且在运行时没有完成必要的格式解析和解释.毕竟,gccprintf("")这些编译器的抱怨可能会"理解"格式并对其进行预处理.

PS:前者的风格更清晰,写作时更明显format("name=%s\n",unameData.nodename);而不是 fputs(stdout,"name=");fputs(stdout,unameData.nodename);putchar('\n');.这是具有格式的所有目的.

Moh*_*ain 5

取决于实现,一个或另一个可以更有效.

通过适当的优化标志,体面的编译器应该能够在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
    ...
Run Code Online (Sandbox Code Playgroud)

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