정적 변수

Static variable

컴퓨터 프로그래밍에서 정적 변수는 "정적으로" 할당변수이며, 이는 프로그램의 수명(또는 "확장")이 전체 실행임을 의미합니다.이는 스토리지가 콜스택에서 스택 할당 및 할당 해제되는 짧은 자동 변수와 대조적이며, 스토리지가 힙 메모리 내에서 동적으로 할당 및 할당 해제되는 개체와는 대조적입니다.

변수 수명은 스코프와 대조됩니다(변수를 사용할 수 있는 경우)."global" 및 "local"은 라이프타임이 아니라 스코프를 가리키지만 스코프가 라이프타임을 의미하는 경우가 많습니다.많은 언어에서 글로벌 변수는 항상 스태틱하지만 일부 언어에서는 다이내믹한 반면 로컬 변수는 일반적으로 자동이지만 스태틱할 수 있습니다.

일반적으로 정적 메모리 할당은 실행 [1]필요에 따라 메모리가 할당되는 동적 메모리 할당 또는 자동 메모리 할당과는 달리 관련 프로그램이 실행되기 전에 컴파일 시에 메모리를 할당하는 것입니다.

역사

스태틱 변수는 적어도 ALGOL 60(1960)까지 거슬러 올라가며, 여기서 자체 변수로 알려져 있습니다.

선언문은 추가 선언자 own으로 표시할 수 있습니다.이것은 다음과 같은 영향을 미칩니다.블록에 재입력하면 자신의 수량의 값은 마지막 출구에서의 값과 변경되지 않고 own으로 마크되지 않은 선언된 변수의 값은 정의되지 않습니다.

--

이 정의는 정적 변수와 미묘하게 다릅니다. 즉, 동작만 지정하기 때문에 저장공간이 아닙니다.예를 들어 프로그램 로드 시간이 아닌 함수를 처음 호출할 때 자체 변수를 할당할 수 있습니다.

이러한 변수를 지칭하기 위해 static이라는 단어를 사용한 것은 적어도 BCPL(1966년)로 거슬러 올라가며 BCPL의 영향을 많이 받은 C 프로그래밍 언어에 의해 널리 보급되어 왔다.BCPL 정의는 다음과 같습니다.

(1) 정적 데이터 항목:
프로그램 실행 시간만큼 범위가 지속되는 데이터 항목. 이러한 데이터 항목은 명확한 상수 Lvalues를 가집니다.모든 정적 데이터 항목은 함수 또는 루틴 정의, 전역 선언 또는 콜론으로 설정된 레이블로 선언되어야 합니다.

--

BCPL은 현재 동적 할당이라는 용어가 사용되고 있는 힙 할당 객체가 아닌 자동 변수(로컬, 스택 할당)라고 불리는 것에 대해 "동적 데이터 항목"을 정의했습니다.

키워드는 C 및 관련 언어에서 정적 변수 및 기타 개념 모두에 사용됩니다.

주소 지정

절대 주소 지정 모드는 정적 변수에서만 사용할 수 있습니다. 정적 변수는 컴파일 시 컴파일러에 의해 위치가 알려진 유일한 변수이기 때문입니다.프로그램(실행 파일 또는 라이브러리)이 메모리에 로드되면 정적 변수는 프로그램 주소 공간데이터 세그먼트(초기화된 경우) 또는 BSS 세그먼트(초기화되지 않은 경우)에 저장되며 로드 전에 개체 파일의 해당 섹션에 저장됩니다.

범위

범위와 범위의 관점에서 정적 변수는 프로그램의 전체 실행 범위를 갖지만 범위가 더 제한적일 수 있습니다.기본적인 구별은 글로벌스코프를 가진 스태틱글로벌 변수와 프로그램 전체에 걸쳐 컨텍스트가 존재하는 스태틱로컬 변수입니다.스태틱 로컬 변수는 로컬 변수와 다릅니다.스태틱 로컬 변수는 존재하는 함수가 호출된 횟수에 관계없이 한 번만 초기화되며 그 값은 카운트 변수로 선언된 함수에 대한 다수의 호출을 통해 유지 및 액세스 가능하기 때문입니다.정적 변수에는 모듈 범위 또는 파일 범위 또는 모듈 범위의 한 형태인 C 내부 링크와 같은 변형도 있을 수 있습니다.

C의 스태틱 로컬 변수의 예를 다음에 나타냅니다.

#실패하다 <stdio.h>  무효 펑크() {   정적인 인트 x = 0;   // x는 Func와 변수의 5개의 콜에 걸쳐서1회만 초기화됩니다.   // 이러한 콜 후에 5배로 증가합니다.x의 최종값   //는 5가 됩니다.   x++;   인쇄물(%d\n", x);  // x 값을 출력합니다. }  인트 주된() {   펑크();  // 인쇄 1   펑크();  // 인쇄 2   펑크();  // 인쇄 3   펑크();  // 인쇄 4   펑크();  // 인쇄 5    돌아가다 0; } 

객체 지향 프로그래밍

오브젝트 지향 프로그래밍에서는 스태틱하게 정의된 클래스의 "클래스 변수"인 스태틱 멤버 변수의 개념도 있습니다.즉, 모든 인스턴스(객체)에 걸쳐 공유되며 이러한 오브젝트의 멤버 변수로 접근할 수 있는 주어진 클래스의 멤버 변수입니다.동적으로 정의된 클래스의 클래스 변수는 실행 시 클래스를 정의할 수 있는 언어로 클래스가 정의되고 정적이지 않은 경우에 할당됩니다.

문자열 리터럴과 같이 컴파일 시에 알려진 객체 상수는 일반적으로 정적으로 할당됩니다.객체 지향 프로그래밍에서 클래스의 가상 메서드 테이블은 일반적으로 정적으로 할당됩니다.정적으로 정의된 값은 일관성 유지를 위해 실행 내내 동일한 불변값을 사용하도록 범위에서 글로벌하게 설정할 수도 있습니다.

「 」를 참조해 주세요.

메모들

  1. ^ Jack Rons. "What is static memory allocation and dynamic memory allocation?". MeritHub [An Institute of Career Development]. Retrieved 2011-06-16. The compiler allocates required memory space for a declared variable. By using the addressof operator, the reserved address is obtained and this address may be assigned to a pointer variable. Since most of the declared variables have static memory, this way of assigning pointer value to a pointer variable is known as static memory allocation. Memory is assigned during compilation time.

레퍼런스