문제

나는 이런 것을 가지고있다

register unsigned int a, b, c;
int n;
for (n = 0; n < 10; ++n){
c = a + b
b = a
a = c
array[n] = c;
}

그것이 무엇인지는 중요하지 않습니다.코드는 지금처럼 빠르게 실행되지만, Register 키워드를 제거하면 더 느려집니다.그러나 int n 앞에 레지스터를 추가하면 실제로는 지금보다 느리게 실행되지만 레지스터를 사용하지 않는 경우보다 빠릅니다.

누군가 나에게 이것을 설명해 줄 수 있습니까?감사해요.

도움이 되었습니까?

해결책

register 컴파일러에게 메모리/스택 공간 대신 ​​레지스터에 변수를 배치하라는 힌트를 제공합니다.어떤 경우에는 이 키워드를 배치한 모든 변수에 대한 레지스터가 충분하지 않을 수 있으므로 너무 많은 변수에 배치하면 나머지 일부가 다시 레지스터에서 제외될 수 있습니다.

하지만 이것은 단지 힌트일 뿐이므로 컴파일러가 이를 받아들일 필요는 없습니다.

다른 팁

어떻게 시간을 보냈습니까? 실제로, register 보통 아무것도하지 않습니다. 컴파일러 기술이 매우 원시적이며 컴파일러가 레지스터 할당 자체를 알아낼 수 없었을 때의 Cruft입니다. 해당 변수에 레지스터를 할당하는 것은 힌트였으며 매우 자주 사용되는 변수에 유용했습니다. 요즘 대부분의 컴파일러는 단순히 그것을 무시하고 자체 알고리즘에 따라 레지스터를 할당합니다.

GCC에서 최적화 옵션을 지정하지 않는 한 레지스터는 확실히 무시되지 않습니다. 이와 같은 것으로 코드를 테스트합니다

unsigned int array[10];

int n;

#define REG register

int main()
{
    REG unsigned int a, b, c;

    for (n = 0; n < 10; ++n){
        c = a + b;
        b = a;
        a = c;
        array[n] = c;
    }
}

당신은 (Reg가 정의되었는지 또는 비어 있는지에 따라)

diff http://picasaweb.google.com/lh/photo/v2hbpl6d-soidbxuomaemw?feat=directlink

왼쪽에는 레지스터를 사용한 결과가 표시됩니다.

사용 가능한 레지스터 수가 제한되어 있으므로 레지스터로 모든 것을 표시하면 모든 것을 레지스터에 넣지 않습니다. 벤치마킹은 도움이 될지 여부를 알 수있는 유일한 방법입니다. 좋은 컴파일러는 자체적으로 레지스터에 어떤 변수를 넣을 변수를 파악할 수 있어야하므로 레지스터 키워드가 도움이되기 전에 더 벤치마킹해야 할 것입니다.

레지스터를 사용한다는 아이디어는 변수가 매우 자주 사용됩니다. 변수에서 작업이 있으면 어쨌든 레지스터에 복사됩니다. 따라서 카운터 (인덱스 변수)는이 수정 자의 후보입니다. 의 예에서 디에고 토레스 밀라노 1 월 15 일부터 1시 57 분부터 이런 식으로 만들 것입니다.

unsigned int array[10];    

int main()
{
    register int n;
    unsigned int a = 1, b = 2, c;

    for (n = 0; n < 10; ++n){
        c = a + b;
        b = a;
        a = c;
        array[n] = c;
    }
}

할당 가능한 레지스터에는 한계가 있습니다. 당신이 그것을 외출한다면, 당신은 덜 효율적인 코드로 끝납니다.

내 생각은 당신이하는 일이 너무 중요하다면 레지스터에 들어가는 것이 무엇인지, 그렇지 않은지 스스로 결정해야한다면, 어셈블리 언어를 사용하여 작성해야한다는 것입니다.

범용 언어의 경우 컴파일러가 인간보다 레지스터에있는 것을 더 잘 결정할 수 있다고 믿습니다. 증거는 레지스터에 얼마나 많은 변수를 넣을 수 있는지 확실하지 않지만 컴파일러는 확실히 알고 있습니다.

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