重复的sprintf格式模式-字符串文字与const char字符串以及编译器优化

时间:2019-07-10 16:26:44

标签: c printf c-strings

在C语言中,编译器优化重复的字符串文字是否常见?我正在使用sprintf语句,该语句使用const char数组为该格式重复相同的字符串文字,并注意到映射文件中的内存使用情况未更改。该测试中使用的编译器是用于嵌入式系统的IAR。

详细说明一下,有六个sprintf语句用于创建到不同地址的ping字符串,类似于:

sprintf(pingString, "ping %s 3 1\r", "127.0.0.1");
sprintf(pingString, "ping %s 3 1\r", primaryDNS);

我用const char替换了格式字符串:

const char pingCommandFormat[] = "ping %s 3 1\r";
sprintf(pingString, pingCommandFormat, "127.0.0.1");
sprintf(pingString, pingCommandFormat, primaryDNS);

然后编译并检查了映射文件,并注意到所使用的内存没有变化。

保留字符串文字而不是使用const char字符串对于提高可读性是理想的选择,但是在嵌入式系统中,优化内存使用是谨慎的。绝不应该从编译器行为中期望优化,但是这种行为在不同的编译器中是常见的吗?

2 个答案:

答案 0 :(得分:2)

即使不启用优化功能,恒定折叠也是很常见的

例如,使用以下代码:

#include <stdio.h>

int main()
{
    const char *str1="hello";
    const char *str2="hello";
    printf("%p\n", (void *)str1);
    printf("%p\n", (void *)str2);
    printf("%p\n", (void *)"hello");
    printf("%p\n", (void *)"hello");
    return 0;
}

基于gent 4.8.5作为gcc -g -Wall -Wextra -o x1 x1.c构建在CentOS 7.2上,它输出:

0x400630
0x400630
0x400630
0x400630

如您所见,在代码中出现的"hello"分别代表相同的字符串文字。

答案 1 :(得分:1)

我不知道编译器没有进行此优化-但是,如果我没记错的话,它不是标准的强制要求。

如果出于可读性考虑:

void createPingString(char const* address)
{
    sprintf(pingString, "ping %s 3 1\r", address);
}

也许更好:

void sendPing(char const* address);

也包含了其余的所有过程...