2016-06-22 8 views
3

当社の静的解析ツールは、重複した文字列(テキストリテラル)があることを示しています。問題は、多くの翻訳単位(ソースファイル)に広がっていることです。ベストプラクティス - 複数の翻訳単位に重複したテキストリテラルを統合

例えば、文字列「NULLコンソールポインタが」module_b.cとmodule_f.cで1時間、module_a.cで5回1回存在します。

また、グローバル変数がないことを示すコードガイドラインもあります。

ヘッダファイルには変数を持たない方がよいでしょう。定数テキストの統合は、他の目的のために部屋を提供(と高速プログラムの負荷を作る)しますので、

当社のプラットフォームは、組み込みシステムです。言い換えれば、テキストリテラルのインスタンスは1つだけでなければなりません。

ので、複数の翻訳単位間で一定のテキスト・リテラルを統合するための効率的な設計やアーキテクチャは何ですか?

重複は、このような文字列"\r\n"

私たちは、このような ゲッター関数を呼び出す上で直接アクセスすることを好むなど、パフォーマンス効率的なソリューションを、好む

として(統合価値がない長さの制限はあります

(注:この時点で、テキストを複数の言語に翻訳される必要はない。)

言語:CとC++(コードベースC++よりもC言語です)。
プロセッサ:ARMのCortex A8
プラットフォーム:組込みシステム、安全性と品質と性能の重要な(医療機器)。
コンパイラ:IAR Embedded Workbench(ARMプロセッサ用)。

編集1:リンカ
を統合ない私は、BINファイルをスキャンし、それが「NULLコンソールポインタ」の複数のインスタンスを含んでいます。

リンカオプション「の重複部分をマージ」と私はそれを確認しています。バイナリにはまだ重複が含まれています。あなたはいけない、懸念は文字列リテラルについてのみである場合

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

ほとんどの現代リンカーは、最適化されたものを正しく取得しますが、そのような場合のSCAツールの警告は無視されます。 –

+1

この質問に対する答えは、コンパイラが自動的にそのような重複排除を行うことができることを説明しています:http://stackoverflow.com/questions/11399682/c-optimisation-of-string-literals – Leon

+0

@Leon:重複しません。テキストリテラルは単一のファイルではありません。問題にはスコープも含まれています。 –

答えて

0

私は、リンカが本当に重複排除に問題を持っているならば、私はリテラル文字列を提供するために、静的な関数を使用したいと思いますあなたのコードを変更する必要があります。

文字列プールをコンパイラで有効にする方法を調べる必要があります。これは、プログラム全体で同一の文字列リテラルを探す最適化オプションです。同じリテラルが2回使用されていることがわかると、同じリテラルが同じメモリアドレスに割り当てられます。このは複数の翻訳単位で動作するはずです。

(GCCではこれが-fmerge-constantsと呼ばれている。私はそれがIARに呼び出されたのか分かりません。)

関連する問題