2017-05-14 3 views
0

現在、私はマイクロコントローラのライブラリを書いています。ほとんどのマイクロコントローラには、RAMよりも多くのフラッシュメモリがあります。私の質問は、ハードウェアやマイクロコントローラに関連するものではありません、私はラムの使用を減らすことができるだけ重要です。私は私の問題を例で説明します。C++プライベートクラスのフィールドをインライン化する方法は?


MyClass.h

class myClass 
{ 
    public: 
     myClass(int _pinA, int _pinB) 
     : pinA{_pinA}, pinB{_pinB} {}; 
     void doSomething(); //for example turnOn(pinB); 
    private: 
     const int pinA, pinB; 
}; 

main.cppに

int main() 
{ 
    myClass object(2,3); 
    object.doSomething(); 
    return 0; 
} 

コンパイラがターンオン(PINB)を参照のであれば、それはPINBの値とPINBを置き換える必要があります(前処理)。あなたはdefineを使うなら達成できますが、私の場合は使えません。


ピン変数は、オブジェクトが存続している限りRAMに格納されます。コンパイラがpinAまたはpinBの値をすべてペーストするようにすることは可能ですか?このようにして、バールはフラッシュ(プログラム)メモリに格納されます。

ありがとうございます!

+0

私はあなたの質問を理解していません。コードに "貼り付け"られる定数。しかし、実行時にRAM(またはCPUレジスタ)にロードする必要があります。それ以外の場合、CPUはCPUにアクセスできません。 – MotKohn

+0

静的オブジェクトを使用しますか?テンプレートを作成しますか?注:これらのタイプの質問は、通常OPがあまりにも "賢い"と人工的な問題を作り出そうとしているために起こります。不必要な複雑さを加えないでください。 –

+0

'myClass'は2つの整数パラメータを取るテンプレートにすることができます。 –

答えて

0

メンバ変数でなくても、宣言をconstに与えても、コンパイラはそれらの変数を格納しないようにする必要はありません。それは最終的に対処するコンパイラに任されます。 constexprの変数であっても、コンパイラが記憶域を割り当てることができます。

変数がのメンバーであるという事実は、コンパイラが変数を投げ捨てるだけでなく、C++メモリモデルに従うことができないことをほぼ不可能にします。コンパイラが特定の状況でそうすることができるように、確かにそれはです。しかし、に保証することはできません。です。

しかし、コンパイラーはストレージを削除するように勧められます。これを行う1つの方法は、myClassをリテラル型にし、そのオブジェクトを含む変数をconstexprと宣言することです。これは何も保証しません。オブジェクトまたはそのサブオブジェクトのいずれかへの参照またはポインタを取得すると、コンパイラは容易にそのメモリを与える必要があります。しかし、それは厳密に必要ではないときにコンパイラがオブジェクトを削除することを容易にします。

関連する問題