在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字符串对于提高可读性是理想的选择,但是在嵌入式系统中,优化内存使用是谨慎的。绝不应该从编译器行为中期望优化,但是这种行为在不同的编译器中是常见的吗?
答案 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);
也包含了其余的所有过程...