4.1.6. __global_reg

__global_reg 스토리지 클래스 지정자는 선언된 변수를 전역 변수 레지스터로 할당합니다.

구문

__global_reg(n) type varName

인수 설명:

n

1과 8 사이의 정수입니다.

type

다음 유형 중 하나입니다.

  • long long을 제외한 모든 정수 유형

  • 모든 문자 유형

  • 모든 포인터 유형

varName

변수 이름

제한

이 스토리지 클래스를 사용할 경우 extern, static 또는 typedef와 같은 추가 스토리지 클래스를 사용할 수 없습니다.

C에서 전역 레지스터 변수는 선언 시 정규화되거나 초기화될 수 없습니다. C++에서 모든 초기화는 동적 초기화로 처리됩니다.

사용하는 AAPCS의 변형에 따라 사용할 수 있는 레지스터의 수는 다르며 5 ~ 7개의 레지스터를 전역 변수 레지스터로 사용할 수 있습니다.

실제로는 다음 이상을 사용하지 않는 것이 좋습니다.

  • ARM 또는 Thumb-2에서 세 개의 전역 레지스터 변수

  • Thumb-1에서 한 개의 전역 레지스터 변수

  • 전역 부동 소수점 레지스터 변수로 사용 가능한 부동 소수점 레지스터 개수의 절반

너무 많은 전역 변수를 선언할 경우 코드 크기가 크게 증가합니다. 프로그램이 컴파일되지 못할 경우도 있습니다.

Caution

전역 레지스터 변수를 사용할 경우 다음과 같은 이유 때문에 주의해야 합니다.

  • 서로 다른 컴파일 단위 간의 직접적 호출이 의미가 있는지 확인하는 링크 타임 시 확인이 없습니다. 가능한 한 프로그램에서 사용되는 전역 레지스터 변수를 프로그램의 각 컴파일 단위에 정의하십시오. 일반적으로 정의는 전역 헤더 파일에 배치하는 것이 가장 좋습니다. 전역 레지스터의 값을 레지스터가 사용되기 전에 코드에서 초기에 설정해야 합니다.

  • 전역 레지스터 변수는 호출 수신자가 저장하는 레지스터에 매핑됩니다. 따라서 그 값은 라이브러리 함수와 같은 전역 레지스터 변수로 해당 값을 사용하지 않는 컴파일 단위에서 함수에 대한 호출에 걸쳐 저장 및 복원됩니다.

  • 전역 레지스터 변수를 사용하는 컴파일 단위로 다시 호출하는 것은 위험합니다. 예를 들어 전역 레지스터를 사용하는 함수가 전역 레지스터 변수를 선언하지 않는 컴파일 단위로부터 호출될 경우, 이 함수는 자신의 예정된 전역 레지스터 변수로부터 잘못된 값을 읽습니다.

  • 이 스토리지 클래스는 파일 범위에서만 사용할 수 있습니다.

예제

Example 4.1에서는 r5로 할당된 전역 변수 레지스터를 선언합니다.

Example 4.1. 전역 정수 레지스터 변수 선언

__global_reg(2) int x      ; v2 is the synonym for r5

전역 레지스터는 동일한 변수의 모든 선언에 지정되어야 하므로 Example 4.2에서 오류가 발생합니다.

Example 4.2.  전역 레지스터 - 선언 오류

int x;
__global_reg(1) int x; // error

C에서 __global_reg 변수는 정의 시 초기화될 수 없습니다. Example 4.3으로 인해 C에서 오류가 발생하지만 C++에서는 오류가 발생하지 않습니다.

Example 4.3. 전역 레지스터 - 초기화 오류

__global_reg(1) int x=1; // error in C, OK in C++
Copyright © 2007 ARM Limited. All rights reserved.ARM DUI 0348AK
Non-Confidential