C ++에서 정적 배열과 동적 배열의 차이점은 무엇입니까?
내 수업에 할당을해야하는데 정적 배열을 사용하지 말고 동적 배열 만 사용하라는 메시지가 표시됩니다. 책과 온라인을 봤지만 이해가 안되는 것 같습니다.
나는 정적이 컴파일 타임에 생성되고 런타임에 동적이라고 생각했지만 이것을 메모리 할당으로 착각 할 수 있습니다.
C ++에서 정적 배열과 동적 배열의 차이점을 설명 할 수 있습니까?
C ++에서 정적 배열과 동적 배열의 차이점은 무엇입니까?
내 수업에 할당을해야하는데 정적 배열을 사용하지 말고 동적 배열 만 사용하라는 메시지가 표시됩니다. 책과 온라인을 봤지만 이해가 안되는 것 같습니다.
나는 정적이 컴파일 타임에 생성되고 런타임에 동적이라고 생각했지만 이것을 메모리 할당으로 착각 할 수 있습니다.
C ++에서 정적 배열과 동적 배열의 차이점을 설명 할 수 있습니까?
답변:
로컬 어레이는 스택에 생성되고 자동 저장 기간이 있습니다. 메모리를 수동으로 관리 할 필요는 없지만 기능이 종료되면 파괴됩니다. 크기는 반드시 고정되어 있어야합니다.
int foo[10];
로 생성 된 어레이 operator new[]
는 동적 저장 기간을 가지며 힙 (기술적으로 "무료 저장소")에 저장됩니다. 크기는 상관 없지만 스택 프레임의 일부가 아니므로 직접 할당하고 해제해야합니다.
int* foo = new int[10];
delete[] foo;
int* foo = new int[N]
합니다.이 배열 은 delete
스스로 해야 하므로 예외가있을 때주의해야합니다. 정적 배열에는 이러한 문제가 없습니다.
static은 C 및 C ++의 키워드이므로 일반적인 설명 용어가 아니라 변수 또는 배열에 적용될 때 매우 구체적인 의미가 있습니다. 혼동을 복잡하게 만들기 위해 별도의 컨텍스트 내에서 세 가지 다른 의미를 가지고 있습니다. 이 때문에 정적 배열은 고정 또는 동적 일 수 있습니다.
설명하겠습니다.
첫 번째는 C ++ 전용입니다.
두 가지는 C에서 상속됩니다.
함수 내에서 정적 변수는 함수 호출 사이에 메모리 위치가 보존되는 변수입니다. 한 번만 초기화되고 함수 호출 사이에 값을 유지한다는 점에서 정적입니다 (정적을 사용하면 함수가 재진입되지 않음, 즉 스레드 안전이 아님).
함수 외부에서 선언 된 정적 변수는 동일한 모듈 내에서만 액세스 할 수있는 전역 변수입니다 (다른 #include의 소스 코드 파일).
당신이 묻는 질문 (내 생각에)은 동적 배열과 고정 또는 컴파일 타임 배열의 차이점입니다. 더 쉬운 질문입니다. 컴파일 타임 배열은 미리 결정되며 (프로그램이 컴파일 될 때) 함수 스택 프레임의 일부입니다. 주 기능이 실행되기 전에 할당됩니다. 동적 배열은 런타임에 "new"키워드 (또는 C의 malloc 계열)로 할당되며 크기는 미리 알려지지 않았습니다. 동적 할당은 프로그램 실행이 중지 될 때까지 자동으로 정리되지 않습니다.
new[]
연산자 를 사용하여 배열의 크기를 선언하면 런타임까지 크기를 어떻게 알 수 있습니까? 즉int* p = new int[10]
나는 당신의 수업에서 사용되는 의미가 혼란 스럽다고 생각합니다. '정적'이 의미하는 것은 단순히 '일정한 크기'이고 '동적'이 의미하는 것은 '가변 크기'입니다. 이 경우 일정한 크기의 배열은 다음과 같습니다.
int x[10];
"동적"구조는 런타임에 기본 스토리지를 늘리거나 줄일 수있는 모든 종류의 구조입니다. 대부분의 경우 std::vector
C ++ 표준 라이브러리 의 클래스로 충분합니다. 다음과 같이 사용하십시오.
std::vector<int> x(10); // this starts with 10 elements, but the vector can be resized.
std::vector
한 operator[]
당신이 배열과 같은 의미로 사용할 수 있도록 정의.
new int[10]
용어의 의미를 명확하게 정의하는 것이 중요합니다. 불행히도 정적 및 동적 배열이 의미하는 바에 대한 여러 정의가있는 것 같습니다.
정적 변수 는 정적 메모리 할당을 사용하여 정의 된 변수 입니다. 이것은 C / C ++와 무관 한 일반적인 개념입니다. C / C ++에서는 다음과 같이 전역, 파일 또는 로컬 범위로 정적 변수를 만들 수 있습니다.
int x[10]; //static array with global scope
static int y[10]; //static array with file scope
foo() {
static int z[10]; //static array with local scope
자동 변수 는 일반적으로 스택 기반 메모리 할당을 사용하여 구현됩니다 . 자동 배열은 다음과 같이 C / C ++로 만들 수 있습니다.
foo() {
int w[10]; //automatic array
무엇 이러한 배열, x, y, z
그리고 w
공통점 그들 각각의 크기가 고정되어 컴파일시에 정의되어 있다는 점이다.
자동 배열과 정적 배열의 차이점을 이해하는 것이 중요한 이유 중 하나는 정적 저장소가 일반적으로 개체 파일 의 데이터 섹션 (또는 BSS 섹션 ) 에서 구현되고 컴파일러가 절대 주소를 사용하여 배열에 액세스 할 수 있기 때문입니다. 스택 기반 스토리지로는 불가능합니다.
일반적으로 동적 배열 이 의미 하는 것은 크기를 조정할 수있는 것이 아니라 런타임에 결정된 고정 된 크기로 동적 메모리 할당 을 사용하여 구현 된 배열 입니다 . C ++에서 이것은 new
연산자를 사용하여 수행됩니다 .
foo() {
int *d = new int[n]; //dynamically allocated array with size n
그러나 다음을 사용하여 런타임에 정의 된 수정 크기로 자동 배열을 만들 수 있습니다 alloca
.
foo() {
int *s = (int*)alloca(n*sizeof(int))
진정한 동적 배열의 경우 std::vector
C ++ (또는 C의 가변 길이 배열 ) 과 같은 것을 사용해야합니다 .
OP의 질문에서 과제는 무엇을 의미 했습니까? 나는 원하는 것이 정적 또는 자동 배열이 아니라 new
연산자를 사용하여 동적 메모리 할당을 사용 하거나 예를 사용하여 고정되지 않은 크기의 배열을 사용 하는 것이 분명하다고 생각합니다 std::vector
.
정적 어레이 :
동적 배열 :
정적 배열 : 효율성. 동적 할당 또는 할당 취소가 필요하지 않습니다.
static modifier를 포함한 함수에서 C, C ++로 선언 된 배열은 정적입니다. 예 : static int foo [5];
배열 측면의 요소를 제공하는 정적 arrary meens
배열 측면의 요소를 제공하지 않고 동적 오류가 발생합니다.
예:
char a[10]; //static array
char a[]; //dynamic array