2016-12-30 2 views
-3

나는 CPU 레지스터가 제한되어 있고 값이 자동으로 저장 될 수 있음을 읽었다.CPU 레지스터에 변수를 저장하는 중

변수가 C의 레지스터에 저장되어 있는지 확인하는 방법은 무엇입니까?

어떤 종류의 변수를 저장할 수 있습니까?

+3

'register'는 컴파일러에 의해 무시 될 수 있으며 레지스터를 할당하는 많은 최신 컴파일러가 될 것입니다. 현재이 주소를 사용할 수없는 부작용 만이 유일한 유스 케이스입니다. 나머지는 귀하의 질문이 너무 광범위합니다. CPU 작동 방식, ** 특정 CPU ** 및 해당 플랫폼의 ABI에 대한 참조 설명서를 읽으십시오. – Olaf

답변

2

대부분의 컴파일러는 어셈블리 언어 출력을 생성하는 -S 또는 /S과 같은 플래그를 지원합니다. 이 코드를 검사하여 컴파일러가 지정된 변수를 레지스터의 지정된 지점에 저장하는지 여부를 확인할 수 있습니다.

등록 할 수있는 유형이 없습니다. 사실 Andrew Tannenbaum의 교과서에있는 JVM의 하드웨어 구현을 포함하여 일부 스택 기반 시스템에는 명시 적 레지스터가 전혀 없습니다. 그러나 int은 일반적으로 레지스터와 동일한 크기입니다 (이전 버전과의 호환성을 위해 intlong을 32 비트로 정의하는 64 비트 환경 인 경우) 포인터는 대개 컴퓨터 주소를 보유하므로 일반적으로 레지스터와 크기가 같습니다 (주소가 두 개의 레지스터에 들어 맞는 16 비트 x86과 같은 분할 된 메모리 모델은 예외이며 배열 번호는 size_tptrdiff_t이므로 일반적으로 레지스터 크기와 동일합니다 (x32 대상, 64 비트 코드 그러나 32 비트 메모리 공간은 예외입니다. 대부분의 CPU에는 각각 부동 소수점 레지스터가있어서 double을 보유 할 수 있지만 그 중 일부는 수행하지 않습니다.

원하는 경우 빠른 휴대 코드, 및 uint_fast32_t<stdint.h> 같은 형식을 사용하는 것이 가장 좋습니다. 이것들은 적어도 충분히 넓은 일반적으로 가장 빠른 크기로 보장됩니다. 정상적인 목표물에서는 기계 레지스터의 크기가 될 것입니다.

관련 문제