12일 - 스토리지 클래스

💯 Days of Code의 12일차가 드디어 끝났습니다. 오늘 저는 상속의 중요한 측면인 변수 및 함수 범위에 대해 배웠습니다.

소개



스토리지 클래스는 변수 또는 함수의 범위를 설정하는 데 사용됩니다. 변수의 저장 클래스를 알면 프로그램 실행 시간 동안 해당 변수의 수명을 결정할 수 있습니다.

C에는 automatic , external , staticregister 의 네 가지 스토리지 클래스 사양이 있습니다. auto, extern, static 및 register 키워드로 각각 식별됩니다.


자동



자동 변수는 항상 함수 내에서 선언되며 선언된 함수에 대해 로컬입니다. 즉, 해당 범위는 해당 기능으로 제한됩니다. 따라서 서로 다른 함수에 정의된 자동 변수는 이름이 같더라도 서로 독립적입니다.

예시:

#include <stdio.h>

int foo() {
    auto int i = 10;
    return i;
}

int bar() {
    auto int i = 20;
    return i;
}

void main() {
    int a = foo();
    int b = bar();
    printf("%d,%d",a,b); // 10, 20
}



통근자



자동 변수와 달리 외부 변수는 단일 함수에 국한되지 않습니다. 범위는 정의 지점에서 프로그램의 나머지 부분까지 확장됩니다. 따라서 일반적으로 두 개 이상의 기능에 걸쳐 있으며 종종 전체 프로그램에 걸쳐 있습니다. 흔히 전역 변수라고 합니다.

외부 변수는 전역적으로 인식되기 때문에 해당 범위에 속하는 모든 함수에서 액세스할 수 있습니다. 이 범위 내에서 할당된 값을 유지합니다. 따라서 한 함수 내에서 외부 변수에 값을 할당할 수 있으며 이 값은 다른 함수 내에서 (외부 변수에 액세스하여) 사용할 수 있습니다.

예시:

파일 1 - index.h

int a = 10;
int b = 20;


파일 2 - main.c

#include <stdio.h>
#include "index.h"

void main() {
    extern int a,b;
    int sum = a + b;
    printf("%d + %d = %d",a,b,sum); // 10 + 20 = 30
}



공전



단일 파일 프로그램에서 정적 변수는 개별 함수 내에서 정의되므로 다음을 갖습니다.
자동 변수와 동일한 범위; 즉, 정의된 함수에 대해 지역적입니다. 같지 않은
그러나 자동 변수static는 프로그램 수명 동안 해당 값을 유지합니다. 따라서 만약
함수가 종료된 다음 나중에 다시 입력되면 해당 함수 내에서 정의된 정적 변수는 유지됩니다.
그들의 이전 값. 이 기능을 사용하면 함수가 실행 내내 정보를 영구적으로 유지할 수 있습니다.
프로그램의.

예시:

#include <stdio.h>

int foo() {
    static int i = 0;
    int j = 0;

    i += 10;
    j += 10;
    printf("i = %d, j = %d\n",i,j);
}

void main() {
    for (int i = 0; i < 5; ++i) {
        foo();
    };
}


출력 -

i = 10, j = 10
i = 20, j = 10
i = 30, j = 10
i = 40, j = 10
i = 50, j = 10



등록하다


register 저장소 클래스 지정자는 객체가 기계 레지스터에 저장되어야 함을 컴파일러에 나타냅니다. register 저장소 클래스 지정자는 일반적으로 액세스 시간을 최소화하여 성능을 향상시키기 위해 루프 제어 변수와 같이 많이 사용되는 변수에 지정됩니다. 그러나 컴파일러는 이 요청을 수락할 필요가 없습니다. 대부분의 시스템에서 사용할 수 있는 레지스터의 크기와 수가 제한되어 있기 때문에 실제로 레지스터에 넣을 수 있는 변수는 거의 없습니다. 컴파일러가 register 객체에 대한 머신 레지스터를 할당하지 않는 경우 객체는 스토리지 클래스 지정자가 있는 것으로 처리됩니다. auto .

예시:

#include <stdio.h>

void main() {
    register int i;
    printf("Memory Address = %p",&i);
}


오류가 발생합니다.

error: address of register variable 'i' requested


변수가 RAM 대신 기계 레지스터에 저장되기 때문입니다.


나중에 수행될 typedef_Thread_local라는 이름의 스토리지 클래스가 두 개 더 있습니다.

좋은 웹페이지 즐겨찾기