auto와 register는 C의 변수 저장 지정자입니다.
auto는 역사적으로 함수/블록 내에서 유효 범위를 가진 자동 변수를 나타냅니다. 모든 로컬 변수가 기본적으로 auto이므로 이를 명시적으로 작성하는 것은 일반적으로 의미가 없습니다.
register는 컴파일러에게 변수를 프로세서의 레지스터에 저장하여 접근 속도를 높이도록 요청합니다. 그러나 현대의 컴파일러는 스스로 저장 최적화를 수행하므로 이 요청을 무시하거나 최소한으로 반응합니다.
또한 register 타입의 변수는 주소를 가질 수 없습니다 (&var는 금지됨).
예시:
register int counter = 0; auto float sum = 0.0f;
register 변수에 대한 포인터를 선언할 수 있습니까? 예:
register int x = 5; int *p = &x;
아니요, register 변수의 주소를 얻을 수 없으며 이는 컴파일 오류가 됩니다. register 지정자는 변수의 주소를 가져오는 작업을 금지합니다.
이야기
오래된 프로젝트에서 개발자는 반복문 변수에 대해 register를 사용했으며, 그 후 이들의 주소를 함수로 전달하려고 했습니다: foo(&i);. 코드는 컴파일되지 않았고 register 지정자를 제거하라는 요구가 있었습니다. 오류는 빌드 중에만 발견되어 리팩토링을 지연시켰습니다.
이야기
팀은 큰 크기의 변수(예: 구조체)에 대해 register를 사용하려 했습니다. 컴파일러는 이 요청을 무시하고 변수를 메모리에 저장하여 예상된 성능 향상을 이루지 못했으며, 개발자들은 느려진 이유를 오랫동안 찾았습니다.
이야기
코드에서 로컬 변수를 위해 auto를 광범위하게 사용하며 이를 좋은 스타일로 여겼습니다(다른 언어를 기준으로). 이는 코드를 불필요하게 복잡하게 만들고, 동작에 영향을 미치지 않으며, 읽기를 어렵게 하여 동료들 사이에서 의문을 유발했습니다.