레지스터 변수

레지스터는 cpu의 일부로, 임시 작업공간같은 저장공간임.

cpu의 일부이기 때문에 엄청 빠름. 엄청 빠른 프로그램을 만들고 싶을 때 object를 메모리가 아니라 레지스터에 두고 싶을 때가 있고, 이때 사용하는게 레지스터 변수이다.

Untitled

레지스터 변수는 메모리에서 위치 빼고 모두 동일하다. 스택이 아니라 레지스터에 위치한다는 차이점 뿐.

근데 레지스터변수라고 해서 꼭 레지스터에 위치하는건 아니다… 컴파일러가 항상 레지스터에 두는건 아님…

예제 코드를 보자.

#define _CRT_SECURE_NO_WARGNINGS
#include <stdio.h>

void temp(register int r)
{
	// do something with r
}

int main()
{
	register int r;
	r = 123;

	//printf("%p\\n", &r);
	int* ptr = &r;

	return 0;
}

r은 레지스터변수이다. 항상 레지스터에 있는건 아님.

임베디드에 사용되는 프로그램을 짜는게 아님 레지스터변수를 주로 쓰지 않는다.

문법적으로 주의할것은, 레지스터변수는 &(주소참조 연산자)를 사용할 수 없다. 가져와서 뭐할건데…? 위험하다.

외에는 다른게 없다.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

블록영역의 정적변수

Untitled

고정적(static)이면서 block scope를 갖는 변수이다.

메모리에 항상 위차한다(Static)고 하니까. 항상 어디서든지 사용할 수 있지 않을까? 하는 생각이 들지만, 이 친구는 특이하게도 본인 블록영역을 벗어나면 invisible해진다. 그래서 이 친구도 외부로 linkage가 안된다.

하지만 메모리에 계속 존재하는건 맞기 때문에 pointer등을 통해 간접접근은 가능하다! 다만 굳이 이걸 포인터까지 써가며 블록 밖에서도 쓰고 싶다면 그냥 쓰지 마라… 다른 전역 변수들 써라.