異なるサイズのスタック上のメモリのコンパイラの割り当てを実行します

StackOverflow https://stackoverflow.com/questions/2231932

質問

私は自分のコンパイラを構築してきたし、それの一つの大きな部分は明らかに可能な限り効率的にマシンレジスタに一時変数を一致するレジスタアロケータ、です。 x86などのアーキテクチャに多くのレジスタが存在しないので、変数がメモリに格納されなければならないで流出の数(スタック)があります。彼らはレジスタに収まるには大きすぎるので、メモリに格納された変数もあります。

レジスタアロケータは、実際には多くのスペースを可能として共有されるように、効率的にメモリに変数を割り当てるために再び呼び出されます。本当の問題は、(私はそれを小さい変数の数として大きい変数を与えることができるので)とアロケータは約小さい変数を移動できるように互いに隣のメモリに2つの変数を配置するために、レジスタアロケータを制限する方法がないです大きな変数が合うことができる、と私は思ったんだけどように、そうでない場合、私は別の領域にメモリを分割する必要があり、これを処理するために周りの任意のアルゴリズムが存在する場合、異なるサイズの各保持変数ます。

ここでは、これを実証する例です

void f(){
    int32_t a, b;
    //something happens to a and b...
    int64_t c;
    //something happens to c...
}

例の目的のためにここに作るためにいくつかの仮定は、cが定義されており、すべての変数はスタックに割り当てられていることをされた後の変数が離れて最適化されておらず、a、bはもはや有用であることは...ありませんメモリ。明らかに私は「a」と「b」と同じメモリを使用するように「C」をしたいと思うだけに使用し、それゆえにのみ8バイト、しかし、私のコンパイラの現在のバージョンは、完全な16のバイトを割り当てますが。割り当てる

私の質問は、私は効率的に異なるサイズのメモリに変数を割り当てることができる方法、ありますか?

役に立ちましたか?

解決

それは、x86上の隣接レジスタ-少なくともを合体しても意味がないので、

明らかに、レジスタアロケータは、スタックスペースを割り当てるのに十分一般的ではない。

なぜ、ちょうどそれを行うには、それを拡張していませんか?または、いっそのこと、除算または直接登録して、スタックの割り当てを処理するために、それをサブクラス化します。

スタックアロケータとしては、2つの変数が非重複範囲に起因同じ割当てを共有することができること(まれな)場合に使用されるスタックを最小化するために通常実行時間効率も特に空間効率的ではありません。スコープの移行時に余分なスタック領域を割り当て、割り当て解除する操作は、それだけの価値になることはほとんどありません。でも、リアルタイム処理の最も重要で、一つはスタック領域の数バイトを削り取るより堅牢性と速度の通常の方法より興味を持ってます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top