最佳实践 - 合并多个翻译单元中的重复文本文字
Best Practice - Consolidating duplicate text literals across many translation units
我们公司的静态分析工具指出存在重复的字符串(文本文字)。问题是它们分布在许多翻译单元(源文件)中。
例如,字符串"NULL console pointer"在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 console pointer" 的多个实例。
链接器有选项"Merge duplicate section",我检查过了。二进制文件仍然包含重复项。
我认为如果链接器确实存在重复数据删除问题,我会使用静态函数来传递文字字符串:
// header file
struct text
{
static const char* hello_world();
};
// one source file
// #include "text.hpp"
const char* text::hello_world() {
static const char _[] = "Hello, World";
return _;
}
// use case
// #include "text.hpp"
#include <iostream>
int main()
{
std::cout << text::hello_world() << std::endl;
}
如果问题仅与字符串文字有关,则您不需要更改代码。
您需要做的是调查如何在您的编译器上启用字符串池。这是一个优化器选项,它会在整个程序中寻找相同的字符串文字。如果它发现相同的文字被使用了两次,它将把它们都分配到相同的内存地址。 应该跨多个翻译单元工作。
(在 GCC 中这叫做 -fmerge-constants
。我不知道在 IAR 中它叫什么。)
我们公司的静态分析工具指出存在重复的字符串(文本文字)。问题是它们分布在许多翻译单元(源文件)中。
例如,字符串"NULL console pointer"在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 console pointer" 的多个实例。
链接器有选项"Merge duplicate section",我检查过了。二进制文件仍然包含重复项。
我认为如果链接器确实存在重复数据删除问题,我会使用静态函数来传递文字字符串:
// header file
struct text
{
static const char* hello_world();
};
// one source file
// #include "text.hpp"
const char* text::hello_world() {
static const char _[] = "Hello, World";
return _;
}
// use case
// #include "text.hpp"
#include <iostream>
int main()
{
std::cout << text::hello_world() << std::endl;
}
如果问题仅与字符串文字有关,则您不需要更改代码。
您需要做的是调查如何在您的编译器上启用字符串池。这是一个优化器选项,它会在整个程序中寻找相同的字符串文字。如果它发现相同的文字被使用了两次,它将把它们都分配到相同的内存地址。 应该跨多个翻译单元工作。
(在 GCC 中这叫做 -fmerge-constants
。我不知道在 IAR 中它叫什么。)