将字符串或常量char[]传递给函数的优点和区别[关闭]

gmxoilav  于 2023-11-16  发布在  其他
关注(0)|答案(1)|浏览(94)

已关闭。此问题为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分钟,没有找到任何有用的,但也许我只是不善于搜索

2wnc66cl

2wnc66cl1#

没有简单的答案
1.第一段代码。许多优化编译器会保留字符串的两个副本。一个带有'\n',一个没有,因为它会尝试优化printf函数,它需要保持数组的使用状态。https://godbolt.org/z/nEahszd3x。如果你改变const char string_to_print[] = "Hello Stackoverflow";,它只会保留一个副本
1.第二个代码-它将只保留一个副本。
1.第三个和第四个代码是相同的,因为宏在C编译之前被文本替换,C编译器将编译完全相同的代码。
但一般来说,除非你不得不,否则不要试图对你的代码进行微优化。专注于主要任务,如果你有性能或资源问题,就开始微优化。

相关问题