2016-06-22 2 views
3

Инструмент статического анализа нашей компании указывает, что существуют дублированные строки (текстовые литералы). Проблема в том, что они распространяются на многие единицы перевода (исходные файлы).Best Practice - Объединение повторяющихся текстовых литералов во многих единицах перевода

Например, строка «NULL console pointer» существует 1 раз в модуле_a.c, 5 раз в модуле_b.c и 1 раз в модуле_f.c.

У нас также есть инструкции по кодированию, в которых говорится, что глобальных переменных нет.

Мы должны не иметь переменных в файлах заголовков.

Наша платформа - это встроенная система, поэтому объединение постоянного текста обеспечит место для других целей (и ускорит загрузку программы). Другими словами, должен быть только один экземпляр текстового литерала.

Итак, что представляет собой эффективный дизайн или архитектура для консолидации постоянных текстовых литералов в нескольких единицах перевода?

Есть ли ограничение по длине, где дублирование не стоит консолидации (например, строки "\r\n"?

Мы предпочитаем решение, производительность эффективной, например, отдавая предпочтение прямого доступа через вызов геттера функцию.

(Примечание: в это время, текст не должен быть переведен на несколько языков.)

языки: C и C++ (код базы больше C-языка, чем C++).
Процессор: ARM Cortex A8
Платформа: встроенная система, безопасность и качество и производительность (медицинское устройство).
Составители: IAR Embedded Workbench (для процессора ARM).

Edit 1: Linker Не Закрепление
Я просмотрел файл BIN и он содержит несколько экземпляров «NULL указателя консоли».

У компоновщика есть опция «Объединить дубликат раздела», и я проверил это. Бинарный файл по-прежнему содержит дубликаты.

+2

Большинство современных линков оптимизированы правильно в любом случае, я просто проигнорировал бы предупреждения инструмента SCA для такого случая. –

+1

Ответ на этот вопрос объясняет, что компиляторы могут выполнять такую ​​дедупликацию автоматически: http://stackoverflow.com/questions/11399682/c-optimisation-of-string-literals – Leon

+0

@Leon: Не дубликат. Текстовые литералы не находятся в одном файле. Этот вопрос также содержит обзор. –

ответ

2

Если забота только о строковых литералах, вы не должны необходимо изменить свой код.

Что вам нужно сделать, так это исследовать, как включить строку пула на ваш компилятор. Это опция оптимизатора, которая ищет идентичные строковые литералы во всей вашей программе. Если он обнаружит, что одни и те же литералы используются дважды, он будет распределять их по одному и тому же адресу памяти. Этот должен работать через несколько единиц перевода.

(В GCC это называется -fmerge-constants. Я не знаю, как это называется в IAR.)

0

Я думаю, что если компоновщик действительно есть проблемы с дедупликацией, я хотел бы использовать статические функции для доставки буквенных строк:

// 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; 
}