適用範囲:RealView Compilation Tools (RVCT) for BREW, RealView Development Suite (RVDS)
ターゲットアプリケーションによって使用されるコードやデータの生成同様、RVCTツールチェインはデバッガによって良いデバッグ情報を見るために読み取られるデバッグデータを生成します。このデータはユーザアプリケーションとともに出荷されることはありませんが、リンカのメモリの使用量とイメージファイルのサイズを削減するために最小化されることが望まれることがあります。
armlinkは共通デバッグセクションを識別し、それら1つ以外の全てを削除することによってデバッグデータの量を削減しようとします。共通デバッグセクションはヘッダファイルが複数のソースファイルからインクルードされた場合にしばしば生成されます。
armlinkはセクションが一致し、且つソースファイルのインクルードイベントのシーケンスが一致した時のみ共通デバッグセクションを削除することができます。プログラマにとってこれらの条件を満たすのを助けるいくつかの方法があります:
-
同一のヘッダファイルのセットをインクルードしている複数のソースファイルはそれぞれにおいて同じ順番でヘッダをインクルードする。
-
リンカは一致しない場合には共通デバッグセクションを削除できないので、ヘッダファイルで条件付
#define
(多重インクルードの防止用を除く)の使用を避ける。
-
C/C++ソースファイルで本当に必要な場合のみヘッダファイルを#includeする。
-
デバッグテーブルからプリプロセッサマクロ定義を取り去るために、
"--no_debug_macros"
オプション(RVCT)または
"-gtp"
オプション(ADS)を用いてコンパイルをおこなう。
-
ヘッダ情報の切り分けを小さなブロックでおこなう(例:大きくて少数のヘッダファイルより、小さくて多数のヘッダファイルを使用する)。これにより多くの共通ブロックをリンカが削除することを助けます。
-
多重インクルード防止用の定義を
#include
式周辺に配置するのではなく、ヘッダに配置する。例えば、ソースファイルに以下を含む場合:
#ifndef FOO
#define FOO
#include <foo.h>
#endif
#include <bar.h>
FOO
に依存してインクルードイベントのシーケンスが異なります。もしこれらの保護用の定義を
foo.h
内に移動すれば、インクルードのシーケンスは定常的に残り共通デバッグセクションの削除を妨げることがありません:
foo.h:
#ifndef FOO
#define FOO
//Rest of header file
#endif
もし、多重インクルード防止用の定義が上記のように単純に(例えば他のテストと組み合わさらない場合)記述されていれば、コンパイラはこの定義を識別し次回このファイルがインクルードされているときには再オープンしないでしょう。これはヘッダファイルのような繰り返しインクルードされるものに対し、コンパイル時のペナルティがないことを意味します。