已关闭。此问题为opinion-based。目前不接受回答。
**要改进此问题吗?**更新此问题,以便editing this post可以使用事实和引文来回答。
20天前关闭。
此帖子于20天前编辑并提交审核,未能重新打开帖子:
原始关闭原因未解决
Improve this question的
假设我有一个程序,在整个执行过程中,我多次将同一行打印到控制台,并且这一行需要多次传递给printf()。
从表面上看,底部的选项当然都做同样的事情,到目前为止,最终结果是相同的,但我不确定它们之间在内存性能,编译器优化(考虑到#define是预处理器关键字),安全性和约定方面的实际差异。
由于我主要从事微控制器的工作,因此一个可能的性能优势实际上会有所不同,但我很好奇这三个之间的技术差异是什么,哪一个更好
1.
#include "stdio.h"
const char string_to_print[] = "Hello Stackoverflow\n";
int main()
{
printf(string_to_print);
printf(string_to_print);
printf(string_to_print);
printf(string_to_print);
return 0;
}
字符串
#include "stdio.h"
int main()
{
printf("Hello Stackoverflow\n");
printf("Hello Stackoverflow\n");
printf("Hello Stackoverflow\n");
printf("Hello Stackoverflow\n");
return 0;
}
型
#include "stdio.h"
#define STRING_TO_PRINT "Hello Stackoverflow\n"
int main()
{
printf(STRING_TO_PRINT);
printf(STRING_TO_PRINT);
printf(STRING_TO_PRINT);
printf(STRING_TO_PRINT);
return 0;
}
型
对不起,如果这已经被问过了,我搜索了10分钟,没有找到任何有用的,但也许我只是不善于搜索
1条答案
按热度按时间2wnc66cl1#
没有简单的答案
1.第一段代码。许多优化编译器会保留字符串的两个副本。一个带有
'\n'
,一个没有,因为它会尝试优化printf
函数,它需要保持数组的使用状态。https://godbolt.org/z/nEahszd3x。如果你改变const char string_to_print[] = "Hello Stackoverflow";
,它只会保留一个副本1.第二个代码-它将只保留一个副本。
1.第三个和第四个代码是相同的,因为宏在C编译之前被文本替换,C编译器将编译完全相同的代码。
但一般来说,除非你不得不,否则不要试图对你的代码进行微优化。专注于主要任务,如果你有性能或资源问题,就开始微优化。