함수 내부에 사이즈가 큰 배열선언
이번에 알고리즘 문제를 풀면서 직면했던 문제인데, 코드를 아무리 실행해도 실행되지 않았다. 이유를 찾아본 결과 함수 내부에 너무 큰 크기의 배열을 선언했기 때문인데, 지속적으로 함수가 호출되면서 큰 사이즈의 배열의 메모리가 다시 재할당되는 것이 성능에 문제를 주기 때문이다. 그렇기에 내가 사용한 IDE는 Visual Studio였는데, 함수안에 큰 사이즈의 배열이 선언되면 컴파일러가 프로그램이 실행되지 않도록 한다. 이 문제는 main함수에서도 똑같이 적용된다.
참고할 부분
함수 내에서 선언되어 사용되는 배열의 경우 배열 자체가 스택 영역에 생성되고, 함수가 호출될 때 마다 해당 배열을 위한 메모리를 새로 생성하고 초기화 하는 작업을 하기 때문에 배열의 크기가 큰 경우에는 다른 방법을 사용해야 한다.
+추가설명
함수가 호출될 때 마다 해당 배열을 위한 메모리를 생성하고 초기화 한다고 했는데, 함수안에서 작성된 내용들은 함수가 끝날 때는 값이 다 사라지기 때문에 함수가 호출될 때 마다 해당 지역변수 배열을 위한 메모리를 생성하고 초기화 한다는 뜻이다.
함수 내에서 크기가 큰 배열을 생성하는 경우 다음과 같은 문제점을 일으킬 수 있다:
1. 배열을 초기화 하는 경우 함수가 호출될 때 마다 값을 채워넣어야 하기 때문에 프로그램의 수행 속도가 느려질 수 있다. 특히나 자주 호출되는 함수인 경우에는 프로그램의 속도를 치명적으로 느리게 만들 수 도 있다.
2. 이론적으로 스택 지역 자동변수가 저장되는 영역의 크기는 제한되지 않지만, 시스템에 따라 하드웨어적인 제한이나 스택 운영의 효율을 높이기 위해 스택의 크기를 제한하기도 한다. 그렇기 때문에 함수 내에서 선언되는 배열의 크기가 과도하게 큰 경우 스택 오버플로우 에러가 발생하고 프로그램이 강제 종료 될 수 도 있다.
3. 컴파일러의 종류나 옵션에 따라서는 컴파일된 프로그램의 크기가 커질 수도 있다.
그렇기 때문에 배열의 크기가 조금이라도 크다는 느낌이 든다면 다른 메모리 영역을 사용하는 것을 고려해 볼 필요가 있다:
1. 스태틱 영역을 사용하는 변수 - 전역 변수나 스태틱 변수를 사용한다.
2. alloc() 계열의 함수를 이용하여 힙영역을 할당하여 사용한다.
'C,C++' 카테고리의 다른 글
[C++] 상수와 포인터 (0) | 2023.01.24 |
---|---|
C언어 string.h 문자열 관련 함수 정리 (0) | 2021.01.09 |
C언어 표준함수 확인 (0) | 2021.01.09 |
[C언어] 배열을 초과해서 데이터 삽입 (0) | 2021.01.07 |