program tip

C ++의 정적 배열과 동적 배열

radiobox 2020. 10. 10. 09:52
반응형

C ++의 정적 배열과 동적 배열


C ++에서 정적 배열과 동적 배열의 차이점은 무엇입니까?

클래스에 할당을해야하는데 정적 배열을 사용하지 말고 동적 배열 만 사용하라는 메시지가 표시됩니다. 책과 온라인을 살펴 봤지만 이해가 안되는 것 같습니다.

나는 정적이 컴파일 시간에 생성되고 런타임에 동적이라고 생각했지만 이것을 메모리 할당으로 착각 할 수 있습니다.

C ++에서 정적 배열과 동적 배열의 차이점을 설명 할 수 있습니까?


로컬 어레이는 스택에 생성되고 자동 저장 기간이 있습니다. 메모리를 수동으로 관리 할 필요는 없지만 기능이 종료되면 파괴됩니다. 반드시 크기가 고정되어 있어야합니다.

int foo[10];

로 생성 된 어레이 operator new[]는 동적 저장 기간을 가지며 힙 (기술적으로 "무료 저장소")에 저장됩니다. 크기는 제한이 없지만 스택 프레임의 일부가 아니기 때문에 직접 할당하고 해제해야합니다.

int* foo = new int[10];
delete[] foo;

static은 C 및 C ++의 키워드이므로 일반적인 설명 용어가 아니라 변수 또는 배열에 적용될 때 매우 구체적인 의미가 있습니다. 혼동을 복잡하게 만들기 위해 별도의 컨텍스트 내에서 세 가지 다른 의미를 가지고 있습니다. 이 때문에 정적 배열은 고정 또는 동적 일 수 있습니다.

설명하겠습니다.

첫 번째는 C ++ 전용입니다.

  • 정적 클래스 멤버는 생성자로 인스턴스화되지 않거나 소멸자로 삭제되지 않은 값입니다. 이는 멤버를 초기화하고 다른 방식으로 유지 관리해야 함을 의미합니다. 정적 멤버는 null로 초기화 된 포인터 일 수 있으며 생성자가 처음 호출 될 때 할당됩니다. (예, 정적 및 동적)

두 가지는 C에서 상속됩니다.

  • 함수 내에서 정적 변수는 함수 호출 사이에 메모리 위치가 보존되는 변수입니다. 한 번만 초기화되고 함수 호출간에 값을 유지한다는 점에서 정적입니다 (정적을 사용하면 함수가 재진입되지 않습니다. 즉, 스레드 안전이 아님).

  • 함수 외부에서 선언 된 정적 변수는 동일한 모듈 (다른 #include의 소스 코드 파일) 내에서만 액세스 할 수있는 전역 변수입니다.

당신이 묻는 질문 (내 생각에)은 동적 배열과 고정 또는 컴파일 타임 배열의 차이점입니다. 더 쉬운 질문입니다. 컴파일 타임 배열은 미리 (프로그램이 컴파일 될 때) 결정되며 함수 스택 프레임의 일부입니다. 주 기능이 실행되기 전에 할당됩니다. 동적 배열은 런타임에 "new"키워드 (또는 C의 malloc 계열)로 할당되며 크기는 미리 알 수 없습니다. 동적 할당은 프로그램 실행이 중지 될 때까지 자동으로 정리되지 않습니다.


나는 당신의 수업에서 사용되는 의미가 혼란 스럽다고 생각합니다. '정적'이 의미하는 것은 단순히 '일정한 크기'이고 '동적'이 의미하는 것은 '가변 크기'입니다. 이 경우 일정한 크기의 배열은 다음과 같습니다.

int x[10];

"동적"구조는 런타임시 기본 스토리지를 늘리거나 줄일 수있는 모든 종류의 구조 일뿐입니다. 대부분의 경우 std::vectorC ++ 표준 라이브러리 클래스로 충분합니다. 다음과 같이 사용하십시오.

std::vector<int> x(10); // this starts with 10 elements, but the vector can be resized.

std::vectoroperator[]당신이 배열과 같은 의미로 사용할 수 있도록 정의.


정적 배열에는 컴파일 타임에 메모리가 할당되고 메모리는 스택에 할당됩니다. 반면 동적 배열에는 런타임에 메모리가 할당되고 메모리는 힙에서 할당됩니다.

int arr[] = { 1, 3, 4 }; // static integer array.   
int* arr = new int[3]; // dynamic integer array.

용어의 의미를 명확하게 정의하는 것이 중요합니다. 불행히도 정적 및 동적 배열이 의미하는 바에 대한 여러 정의가있는 것 같습니다.

정적 변수정적 메모리 할당을 사용하여 정의 된 변수 입니다. 이것은 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::vectorC ++ (또는 C의 가변 길이 배열 ) 과 같은 것을 사용해야합니다 .

OP의 질문에서 과제에 대한 의미는 무엇입니까? 나는 원하는 것이 정적 또는 자동 배열이 아니라 new연산자를 사용하여 동적 메모리 할당을 사용 하거나 예를 사용하여 고정되지 않은 크기의 배열을 사용 하는 것이 분명하다고 생각합니다 std::vector.


이 맥락에서 크기가 고정되어 있다는 점에서 정적이라는 의미라고 생각합니다. std :: vector를 사용하십시오. resize () 함수가 있습니다.


런타임시 사용자가 크기를 설정 한 다음 그 후에 고정되는 유사 동적 배열을 가질 수 있습니다.

int size;
cin >> size;
int dynamicArray[size];

Yes right the static array is created at the compile time where as the dynamic array is created on the run time. Where as the difference as far is concerned with their memory locations the static are located on the stack and the dynamic are created on the heap. Everything which gets located on heap needs the memory management until and unless garbage collector as in the case of .net framework is present otherwise there is a risk of memory leak.


Static array :Efficiency. No dynamic allocation or deallocation is required.

Arrays declared in C, C++ in function including static modifier are static. Example: static int foo[5];


static arrary meens with giving on elements in side the array

dynamic arrary meens without giving on elements in side the array

example:

     char a[10]; //static array
       char a[];  //dynamic array

참고URL : https://stackoverflow.com/questions/2672085/static-array-vs-dynamic-array-in-c

반응형