gpt4 book ai didi

c - 为什么编译时已知的格式字符串没有优化?

转载 作者:行者123 更新时间:2023-12-04 14:08:02 27 4
gpt4 key购买 nike

现在编译器优化疯狂的东西。特别是 gcc 和 clang 有时会进行非常疯狂的转换。

所以,我想知道为什么下面这段代码没有优化:

#include <stdio.h>
#include <string.h>

int main() {
printf("%d\n", 0);
}

我希望高度优化的编译器生成与此等效的代码:

#include <stdio.h>
#include <string.h>

int main() {
printf("0\n");
}

但是 gcc 和 clang 不在编译时应用该格式(参见 https://godbolt.org/z/Taa44c1n7 )。有没有应用这种优化的原因?

我经常看到一些格式参数在编译时是已知的,所以我想这可能是有意义的(特别是对于浮点值,因为格式化可能相对昂贵)。

最佳答案

假设在一个函数的不同位置有以下四行:

printf("%d\n", 100);
printf("%d\n", 120);
printf("%d\n", 157);
printf("%d\n", 192);

在为典型的 ARM 微 Controller 编译时,每个 printf 调用都需要八个字节,所有四个函数调用将共享四个字节用于保存字符串地址的副本,四个字节用于字符串本身。因此,代码和数据的总数为 40 个字节。

如果将其替换为:

printf("100\n");
printf("120\n");
printf("157\n");
printf("192\n");

然后每个 printf 调用只需要六个字节的代码,但需要在内存中有自己单独的五个字节字符串,以及四个字节来保存地址。因此,总代码加数据需求将从 40 个字节增加到 60 个字节。远非优化,因此实际上会增加 50% 的代码空间需求。

即使只有一次 printf 调用,节省的成本也微乎其微。原始版本调用的八个字节加上八个字节的数据开销将是 16 个字节。代码的第二个版本需要八个字节的代码加上七个字节的数据,总共 17 个字节。在最好的情况下会节省一点存储空间,但在几乎不可信的情况下会花费很多的优化并不是真正的优化。

关于c - 为什么编译时已知的格式字符串没有优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66761836/

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