我们公司的静态分析工具表明存在重复的字符串(文本文字)。问题是它们分布在许多翻译单元(源文件)中。
例如,字符串" NULL控制台指针"在module_a.c中存在1次,在module_b.c中存在5次,在module_f.c中存在1次。
我们还有编码指南,声明没有全局变量。
我们更喜欢在头文件中没有变量。
我们的平台是一个嵌入式系统,因此合并常量文本将为其他目的提供空间(并使程序加载速度更快)。换句话说,应该只有一个文本文字实例。
那么,在多个翻译单元中整合常量文本文字的有效设计或架构是什么?
是否存在重复不值得合并的长度限制(例如字符串"\r\n"
?
我们更喜欢性能高效的解决方案,例如优先选择直接访问而不是调用 getter 函数。
(注意:此时,文本不需要翻译成多种语言。)
语言:C和C ++(代码库比C ++更多C语言)
处理器:ARM Cortex A8
平台:嵌入式系统,安全和质量以及性能关键(医疗设备)
编译器:IAR Embedded Workbench(用于ARM处理器)。
编辑1:链接器未整合
我扫描了BIN文件,它确实包含" NULL控制台指针"的多个实例。
链接器具有选项" Merge duplicate section"我查了一下二进制文件仍包含重复项。
答案 0 :(得分:2)
如果关注的只是字符串文字,则不需要更改代码。
您需要做的是研究如何在编译器上启用字符串池。这是一个优化器选项,可以在整个程序中查找相同的字符串文字。如果它发现两次使用相同的文字,它将在同一个内存地址分配它们。 应该跨多个翻译单元工作。
(在GCC中,这称为-fmerge-constants
。我不知道IAR中的内容。)
答案 1 :(得分:0)
我认为如果链接器确实存在重复数据删除问题,我会使用静态函数来提供文字字符串:
public string showSkeds(string id)
{
DataTable dt = new DataTable();
SqlCommand cmd = new SqlCommand("showSkeds", con);
cmd.Parameters.Add("@id", SqlDbType.NVarChar, 100).Value = id;
cmd.CommandType = CommandType.StoredProcedure;
dt = hlp.resultHelper(cmd);
int count = dt.Rows.Count;
List<string> value = new List<string>();
for (int i = 0; i < count; i++)//rows
{
value.Add(dt.Rows[i][0].ToString() + "|" + dt.Rows[i][1].ToString());
}
string[] result = value.ToArray();
return **result**;
}