"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > C++의 스택에서 대규모 배열을 선언할 수 있습니까?

C++의 스택에서 대규모 배열을 선언할 수 있습니까?

2024년 11월 11일에 게시됨
검색:996

Can Large Arrays Be Declared on the Stack in C  ?

스택에서 대규모 배열 선언: 실현 가능합니까?

Dev C 내에서 4200000 double과 같은 거대한 크기의 배열을 선언하려고 할 때 사용자는 다음을 수행할 수 있습니다. 예상치 못한 문제에 직면하게 됩니다. 컴파일러는 오류를 표시하지 않을 수 있지만 프로그램은 실행 시 갑자기 종료됩니다. 더욱이 이러한 문제는 상당한 크기의 배열에서만 발생하는 반면, 더 작은 크기의 배열은 완벽하게 작동합니다.

스택에 이러한 큰 배열을 할당하는 데 따른 고유한 단점에도 불구하고 시뮬레이션의 고유한 요구 사항으로 인해 직접 요소 액세스가 필요합니다. 효율적인 계산을 위해 이는 난제를 야기합니다. 앞서 언급한 장애물을 우회하는 방식으로 이 배열을 스택에 선언할 수 있습니까?

불행히도 대답은 '아니오'입니다. 스택의 배열을 선언하는 것은 실행 가능한 옵션이 아니지만 스택과 힙의 요소를 결합하는 솔루션이 있습니다.

double *n = new double[4200000];

By 이 접근 방식을 사용하면 포인터 n이 스택에 선언되고 배열의 메모리는 힙에 할당됩니다. 결과적으로 이 방법을 사용하여 n[234]에 액세스하는 것은 다음과 같이 선언된 배열의 n[234]에 액세스하는 것과 구별할 수 없게 됩니다.

double n[500];

성능 향상을 위해 벡터는 고용:

std::vector someElements(4200000);
someElements[234];

또한 벡터는 -O3으로 최적화할 때 더 안전하고 동일하게 효율적입니다.

메모리를 동적으로 할당하는 대체 방법:

double *n = new double[4200000];

메모리 할당을 해제하는 것이 중요합니다. 명시적으로:

delete[] n;

그렇지 않으면 메모리 누수가 발생하고 잠재적으로 불안정해질 수 있습니다. 따라서 이 기술은 특히 예외 및 기타 복잡성을 처리할 때 본질적으로 안전하지 않습니다.

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3