2

armccコンパイラを使用して組み込みソフトウェアを開発しています。デバッグ目的で、 -O0フラグを使用して最適化を最小限に抑えます。コードをわかりやすくするために、いくつかの列挙型と構造体の定義をパブリック アクセスを持つクラスに移動しました。

これから:

enum A{
 a,
 b,
 c,
 d
};

struct C{
 int q;
 int w;
 int e;
};

class myClass{

....
};

これに:

class myClass{
 public:
    enum A{
     a,
     b,
     c,
     d
    };

    struct C{
     int q;
     int w;
     int e;
    };
....
};

そして、myClass のようにそれらに到達します。

myClass::C new_struct;
new_struct.q= myClass::a;

しかし、驚いたことに、コードに他に違いはなくても、コード サイズが 600 バイトほど増加しました。列挙型を直接の値に置き換えるコンパイラの最適化 (-O0 でもいくつかの最適化がアクティブになっている) が原因であると思いますが、これについてはわかりません。コード サイズが増加した原因 (または、最適化が妨げられた原因) は何ですか?

4

2 に答える 2

3

どちらのビルドにも、elf に埋め込まれたデバッグ データがあります。

イメージに含まれるデバッグ シンボル テーブルには、プログラムで定義された各項目に関する情報が含まれています。enumanと astructをクラス内に移動すると、enumと の要素に関連する名前がstruct大きくA::aなります。これらの長い文字列はすべて、画像ファイル内で追加のスペースを必要とし、サイズを大きくします。myClass::A::aA::bmyClass::A::b

デバッグ シンボルを削除すると、2 つのコードが同じサイズのイメージを生成するようになります。

于 2015-01-08T17:32:09.267 に答える