最佳实践 - 在多个翻译单元中合并重复的文本文字

时间:2016-06-22 16:15:00

标签: c++ c build embedded code-duplication

我们公司的静态分析工具表明存在重复的字符串(文本文字)。问题是它们分布在许多翻译单元(源文件)中。

例如,字符串" 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"我查了一下二进制文件仍包含重复项。

2 个答案:

答案 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**;
}