私は独自のコンパイラを構築してきましたが、その大部分は明らかにレジスタ アロケータであり、一時変数とマシン レジスタを可能な限り効率的に一致させます。x86 などのアーキテクチャでは、多くのレジスタがないため、変数をメモリ (スタック) に格納する必要がある多数のスピルがあります。大きすぎてレジスタに収まらないため、メモリに格納される変数もあります。
レジスタ アロケータが実際に再度呼び出され、メモリ内の変数が効率的に割り当てられるため、できるだけ多くのスペースが共有されます。本当の問題は、レジスタ アロケータがメモリ内の 2 つの変数を隣り合わせに配置するように制約する方法がないことです (これは、レジスタ アロケータが小さい変数をいくつかの小さい変数として割り当てることができるためです)。より大きな変数が収まるように、これを処理するアルゴリズムがあるかどうか疑問に思っています。それ以外の場合は、メモリを異なる領域に分割し、それぞれが異なるサイズの変数を保持する必要があります。
これを示す例を次に示します。
void f(){
int32_t a, b;
//something happens to a and b...
int64_t c;
//something happens to c...
}
この例では、変数が最適化されていないこと、c が定義されると a と b が役に立たなくなること、すべての変数がスタック メモリに割り当てられることを前提としています。明らかに、'c' が 'a' および 'b' が使用したのと同じメモリを使用するため、8 バイトのみを割り当てる必要がありますが、現在のバージョンのコンパイラでは 16 バイトが完全に割り当てられます。
私の質問は、さまざまなサイズのメモリに変数を効率的に割り当てるにはどうすればよいですか?