継承を使用して、C ++でコンパイルされたコードのサイズを減らすことはできますか?

ファラプ

私はArduinoベースのシステム(つまり組み込みシステム)のプロジェクトに取り組んでおり、コードが存在するためのROMの量が限られています。

私は自分自身のコレクションクラス(例えば、いくつかの異なるタイプを必要と発見しましたListStackQueue)。これらを書いた後、動作を変える機能(Addvs Pushvs EnqueuePopvsなどDequeueを除いて、多くの共通機能を共有していることに気付きました(たとえば、まったく同じフィールドを持っています)。

これは、他のクラスのすべての共通機能を含む基本クラスを作成し(それを呼びましょうCollection)、他のクラスにそれを継承させ、異なる機能のみを実装させるとしたら、そうなるだろうと思いました。コンパイルされたコードが少なくなりますか?

子クラスはすべて親の共通関数の実装を参照できるため、そうなると思いますが、間違っている可能性があるため、この変更を試みる前に質問したいと思います。


さて、人々は誤解しているように見えるので、これをさらに明確にするために、これらの架空のクラスを検討してください。

class A
{
protected:
    int value;
public:
    void assign(int other)
    {
        this->value = other;
    }
}

class B : public A
{
public:
    void assignAdd5(int other)
    {
        this->value = other + 5;
    }
}

そして、コード:

A a = A();
B b = B();

a.assign(4);
b.assign(4);

はのサブクラスであるassignため、タイプが異なるにもかかわらず、両方の場合で同じメソッド(したがって、同じコンパイル済みコードブロック)参照すること期待していますこの場合、類似した機能を持つクラスをすべて単一の基本クラスから継承して類似性を実装すると、各子クラスが同じ関数を使用するため、各クラスに機能を個別に実装させるよりもコンパイルされたコードが少なくなります。BA

この質問を引き起こした状況に関して私が提供した情報は単なる背景であり、これが私が使用ているコンパイラだけでなくどのコンパイラに当てはまるかどうかにあります(そして答えは「コンパイラーはこれを行いますが、すべてが行うわけではありません」、そしてそれは完全に受け入れられる答えです)。

idclev 463035818

明確な答えは出せませんが、私の発見を共有したいと思います。実際、私は思ったほど違いを測定するのは簡単ではありません。コードをあまり真剣に受け止めないでください、私はそれが影響を与えるかどうかを確認するためにランダムなものを試していました...

#include <iostream>
#define DERIVED
#define BASE_STUFF     int a,b,c,d,e,f,g,h,i,k,m,n,o,p,q,r,s,t,u,v,w,x,y,z; \
                       double foo1(int x){return x;}                        \
                       double foo2(int x){return x;}                        \
                       double foo3(int x){return x;}                        \
                       double foo4(int x){return x;}                        \
                       Base*  foo5(Base* x){return x;}                      \
                       FPTR   foo5(FPTR a,FPTR b,FPTR c){return a;}

typedef double (*FPTR)(int,int,double);

struct Base { BASE_STUFF };

#ifdef DERIVED
struct Derived : Base{double a0,a1,a2,a3,a4,a5,a6,a7;};
#endif

#ifndef DERIVED
struct Derived {
    double a0,a1,a2,a3,a4,a5,a6,a7;
    BASE_STUFF
};
#endif

int main(int argc, char *argv[])
{
    Base b;
    b.x = 1;
    std::cout << b.foo1(b.x);
    std::cout << b.foo5(&b)->foo2(b.a);
    Derived n;
    n.a0 = 2;
    std::cout << n.foo1(n.a0);
}

番号をもう一度確認する必要がありますが、驚いたことに、iostreamsを使用した場合の実行可能ファイルはc-styleと比較して小さかったprinft

これを(g ++ 4.9.2)でコンパイルすると

g++ main.cpp -Os -fno-exceptions -s

13.312kBの実行可能ファイルを取得します。そして、それはDERIVED定義されているかどうかとは無関係ですしかし、私がそれをコンパイルすると

g++ main.cpp -Os -fno-exceptions

サイズは43.549kBです。再びDERIVED定義されているかどうかに関係なく。

私の結論は

  • 私の例は違いを測定するのに良くありません
  • ...ただし、コンパイラフラグを試すと大きな違いが生じますが、継承の有無はほとんど違いがありません。
  • コードサイズを小さくする目的でデザインを変更することはありません。exeからkBを絞り出す必要がある場合は、コンパイラフラグの読み取り、書き込み、使用、使用が簡単になるようにコードを記述します(こちらも参照)。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

サイズとして変数が与えられた文字配列を持つこのコードがコンパイルされるのはなぜですか?

分類Dev

ClangはGCCでコンパイルされた.a libsでコードをコンパイルできますか?

分類Dev

wasmにコンパイルされたC#からC ++を呼び出すことはできますか?

分類Dev

コードベースでRTTIを選択的に無効にして、バイナリサイズを減らすことはできますか?

分類Dev

CythonでコンパイルされたコードとPythonの相互作用を減らす方法

分類Dev

Nautilusのパーソナライズされたアイコンをすべてバックアップすることはできますか?

分類Dev

サイズの大きいベクトルを容量の小さいベクトルに移動する前に、reserve()を使用してコードのパフォーマンスを向上させることはできますか?

分類Dev

継承されたコントロールのプロパティとしてTextFormatFlagsを使用するにはどうすればよいですか?

分類Dev

カーネルをコンパイルするときにinitrdのサイズを減らす方法は?

分類Dev

カーネルをコンパイルするときにinitrdのサイズを減らす方法は?

分類Dev

継承されたコンストラクターを使用してオブジェクトをコピーすることはできません

分類Dev

インタフェースを実装しているときにエラーが「継承されたメソッドの可視性を減らすことはできません」

分類Dev

VbaExcel。ファイルからロードしたときに画像のサイズを変更してから、base64でエンコードします

分類Dev

親から継承されたメソッドの可視性を減らすことはできません

分類Dev

aspnet / blazorによってコンパイルされたdll / wasmのサイズを減らす方法は?

分類Dev

babelとwebpackでトランスパイルされたコードヘルパーを減らす

分類Dev

継承されたコードはPearのMDB2を使用します-安全に保管できますか?

分類Dev

react.jsで同じクラス名を使用しているときに、cssスタイルがコンポーネントからリーク(他のコンポーネントに継承される)するのはなぜですか?

分類Dev

コンパイルされたシェルコードを元に戻すことは可能ですか?

分類Dev

プロトタイプを使用して別のコンストラクターから継承することと、継承するコンストラクター内でapplyメソッドを使用することの違い

分類Dev

グーグル、フェイスブック、ツイッター、またはFirebaseコンソールからの匿名サインアップで認証されたユーザー数を確認することはできますか?

分類Dev

TypeScriptを縮小されたコードにコンパイルすることは可能ですか?

分類Dev

既存のファイルのサイズを減らすことはできますか?

分類Dev

C ++は、コンパイルされたコードに使用されるコードの一部のサイズを取得します

分類Dev

サーバーとクライアントの両方でブロックすることなく、サーバーでリアルタイムに書き込まれているアップロードされたファイルのファイルサイズを読み取ってエコーする方法は?

分類Dev

Powershellから呼び出されたときにこのFFMPEGコマンドがホワイトノイズを生成するのはなぜですか?

分類Dev

継承を使用したC#の問題-初めて

分類Dev

コンパイル時に定義された配列のサイズを超える数の要素を配列に含めることは可能ですか?

分類Dev

サードパーティのプリコンパイル済みLIBファイルからPDBファイルを抽出または生成できますか

Related 関連記事

  1. 1

    サイズとして変数が与えられた文字配列を持つこのコードがコンパイルされるのはなぜですか?

  2. 2

    ClangはGCCでコンパイルされた.a libsでコードをコンパイルできますか?

  3. 3

    wasmにコンパイルされたC#からC ++を呼び出すことはできますか?

  4. 4

    コードベースでRTTIを選択的に無効にして、バイナリサイズを減らすことはできますか?

  5. 5

    CythonでコンパイルされたコードとPythonの相互作用を減らす方法

  6. 6

    Nautilusのパーソナライズされたアイコンをすべてバックアップすることはできますか?

  7. 7

    サイズの大きいベクトルを容量の小さいベクトルに移動する前に、reserve()を使用してコードのパフォーマンスを向上させることはできますか?

  8. 8

    継承されたコントロールのプロパティとしてTextFormatFlagsを使用するにはどうすればよいですか?

  9. 9

    カーネルをコンパイルするときにinitrdのサイズを減らす方法は?

  10. 10

    カーネルをコンパイルするときにinitrdのサイズを減らす方法は?

  11. 11

    継承されたコンストラクターを使用してオブジェクトをコピーすることはできません

  12. 12

    インタフェースを実装しているときにエラーが「継承されたメソッドの可視性を減らすことはできません」

  13. 13

    VbaExcel。ファイルからロードしたときに画像のサイズを変更してから、base64でエンコードします

  14. 14

    親から継承されたメソッドの可視性を減らすことはできません

  15. 15

    aspnet / blazorによってコンパイルされたdll / wasmのサイズを減らす方法は?

  16. 16

    babelとwebpackでトランスパイルされたコードヘルパーを減らす

  17. 17

    継承されたコードはPearのMDB2を使用します-安全に保管できますか?

  18. 18

    react.jsで同じクラス名を使用しているときに、cssスタイルがコンポーネントからリーク(他のコンポーネントに継承される)するのはなぜですか?

  19. 19

    コンパイルされたシェルコードを元に戻すことは可能ですか?

  20. 20

    プロトタイプを使用して別のコンストラクターから継承することと、継承するコンストラクター内でapplyメソッドを使用することの違い

  21. 21

    グーグル、フェイスブック、ツイッター、またはFirebaseコンソールからの匿名サインアップで認証されたユーザー数を確認することはできますか?

  22. 22

    TypeScriptを縮小されたコードにコンパイルすることは可能ですか?

  23. 23

    既存のファイルのサイズを減らすことはできますか?

  24. 24

    C ++は、コンパイルされたコードに使用されるコードの一部のサイズを取得します

  25. 25

    サーバーとクライアントの両方でブロックすることなく、サーバーでリアルタイムに書き込まれているアップロードされたファイルのファイルサイズを読み取ってエコーする方法は?

  26. 26

    Powershellから呼び出されたときにこのFFMPEGコマンドがホワイトノイズを生成するのはなぜですか?

  27. 27

    継承を使用したC#の問題-初めて

  28. 28

    コンパイル時に定義された配列のサイズを超える数の要素を配列に含めることは可能ですか?

  29. 29

    サードパーティのプリコンパイル済みLIBファイルからPDBファイルを抽出または生成できますか

ホットタグ

アーカイブ