문제

나는 내 자신의 컴파일러를 구성해 왔으며 그 중 하나의 큰 부분은 분명히 임시 변수를 기계 레지스터와 가능한 한 효율적으로 일치시키는 레지스터 할당자입니다.x86과 같은 아키텍처에는 레지스터가 많지 않으므로 변수를 메모리(스택)에 저장해야 하는 유출이 많습니다.변수가 너무 커서 레지스터에 들어갈 수 없기 때문에 메모리에 저장되는 변수도 있습니다.

레지스터 할당자는 실제로 변수를 메모리에 효율적으로 할당하기 위해 다시 호출되므로 가능한 한 많은 공간이 공유됩니다.실제 문제는 레지스터 할당자가 두 개의 변수를 메모리에 나란히 배치하도록 제한하고(더 큰 변수를 여러 개의 작은 변수로 제공할 수 있기 때문에) 할당자가 더 작은 변수를 이동할 수 있도록 허용하는 방법이 없다는 것입니다. 더 큰 변수가 들어갈 수 있도록 하고, 이를 처리할 알고리즘이 있는지 궁금합니다. 그렇지 않으면 메모리를 서로 다른 크기의 변수를 보유하는 여러 영역으로 나누어야 합니다.

이를 보여주는 예는 다음과 같습니다.

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바이트를 할당합니다.

제 질문은 다양한 크기의 메모리에 변수를 어떻게 효율적으로 할당할 수 있느냐는 것입니다.

도움이 되었습니까?

해결책

적어도 x86에서는 인접한 레지스터를 통합하는 것이 합리적이지 않기 때문에 레지스터 할당자는 스택 공간을 할당할 만큼 일반적이지 않습니다.

그렇게 하기 위해 확장하는 것은 어떨까요?또는 더 나은 방법은 레지스터 및 스택 할당을 직접 처리하기 위해 분할하거나 하위 클래스로 분류하는 것입니다.

스택 할당자의 경우 일반적으로 두 변수가 겹치지 않는 범위로 인해 동일한 할당을 공유할 수 있는 (드문) 경우에 사용되는 스택을 최소화하는 것이 실행 시간 효율적이거나 특히 공간 효율적이지 않습니다.범위 전환 시 추가 스택 공간을 할당 및 할당 해제하는 작업은 그만한 가치가 없을 것 같습니다.가장 중요한 실시간 처리에서도 일반적으로 몇 바이트의 스택 공간을 줄이는 것보다 견고성과 속도에 더 관심이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top