gpt4 book ai didi

c - 为什么 `printf("%s", "foo")` not being optimized to ` fputs ("foo", stdout)`?

转载 作者:行者123 更新时间:2023-12-04 03:27:46 25 4
gpt4 key购买 nike

因此 GCC 和 Clang 都足够聪明,可以将 printf("%s\n", "foo") 优化为 puts("foo") ( GCC , Clang)。这很好。

但是当我通过 Compiler Explorer 运行这个函数时:

#include <stdio.h>

void foo(void) {
printf("%s", "foo");
}

GCC 和 Clang 都没有将 printf("%s", "foo") 优化为 fputs("foo", stdout),我认为这应该是相同的(因为 fputs 不像 puts) 那样将换行符放到 printf 中并且速度更快。

x86-64 GCC 11.1 ( link ):

.LC0:
.string "foo"
.LC1:
.string "%s"
foo:
mov esi, OFFSET FLAT:.LC0
mov edi, OFFSET FLAT:.LC1
xor eax, eax
jmp printf

x86-64 Clang 12.0.0 ( link ):

foo:                                    # @foo
mov edi, offset .L.str
mov esi, offset .L.str.1
xor eax, eax
jmp printf # TAILCALL
.L.str:
.asciz "%s"

.L.str.1:
.asciz "foo"

fputs 没有优化的具体原因是什么,还是编译器不够智能?

最佳答案

一些非常具体的情况得到了优化,就像你展示的那样,但它非常肤浅,如果你在你的格式字符串中添加一些东西,甚至是一个空格,它immediately discards the puts and goes back to printf .

我想没有什么可以阻止更广泛的优化,我的猜测是,由于性能提升不是那么好,进一步添加更多特殊被认为是不值得的.

根据我的推测,fputs 优化的缺乏属于不值得类别。

这个旧的 gcc printf optimization document阐明了这些优化,我怀疑今天会有很大不同。

具体来说:

2.3 %s\n

A printf call with the format string %s\n [line 4679-4687] is converted to a puts() call.

 printf("%s\n", "hello world"); // converted to puts("hello world");

2.8 The string not ending with \n

No optimization if the string is not ending with \n [line 4721-4739].

2.9 The string ending with \n

A printf call with a simple format string ending with \n [line 4721-4739] is converted to a puts() call.

 printf("hello world\n"); // converted to puts("hello world");

关于c - 为什么 `printf("%s", "foo")` not being optimized to ` fputs ("foo", stdout)`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67344987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com