이전글 -> [C++ 기술면접 대비(1)]
[공통점]
\n과 endl 모두 출력할 때 개행(줄 띄움)을 위해 사용한다.
[차이점]
endl은 출력 버퍼를 비워주는 과정(flush)이 들어가 있어서 \n보다 느리다. 버퍼는 입출력을 프로그램에 바로 전달하지 않고 임시 메모리 공간에 저장한 후 한번에 전송하는 역할을 한다. 버퍼를 즉시 비우고 싶다면 endl을 그렇지 않다면 \n을 사용한다. 하지만 구현체에 따라서 버퍼를 비우도록 처리하는 경우도 있다고 한다.
[공통점]
malloc과 new 모두 동적할당을 하기 위해 사용된다.
[차이점]
보통 malloc은 C언어에서 new는 C++ 언어에서 사용된다. malloc은 함수고 new는 연산자이다. malloc은 heap 영역에서, new는 dynamic memory에서 할당된다. malloc은 초기값 지정 불가능하고, new는 초기값 지정이 가능하다. new는 객체에서 생성자를 자동으로 호출하고 초기화해준다. 객체의 경우에는 new를 사용하는 것이 맞지만, 재할당이 많이 일어날 경우에는 malloc으로 동적할당하는 경우도 있다. realloc과 같은 함수가 존재 때문에 malloc을 이용하는 경우도 있다.
객체를 생성하고 초기화시킬 때 멤버변수를 어떻게 초기화하느냐에 따라 얕은 복사, 깊은 복사를 나눈다.
얕은 복사는 실제 데이터가 아닌 단지 메모리 주소만을 복사한다.
깊은 복사는 변수가 관리하는 리소스 자체를 복사(새롭게 메모리를 할당)하여 새롭게 멤버 변수에 복사한다. 얕은 복사에 비해 작업 시간과 리소스의 소모가 따른다.
- 소스(source) 코드 작성 : C++ 프로그램을 작성합니다. 이 과정에서 텍스트 편집기를 사용하여 소스 코드를 작성합니다.
- 전처리(preprocessing) : 전처리기는 소스 코드를 분석하여 #include, #define, #ifdef 등과 같은 전처리 지시문을 처리합니다. 이 지시문은 소스 코드의 수정 없이 컴파일러가 사용할 수 있는 형식으로 변환됩니다.
- 컴파일(compiler) : 컴파일러는 전처리된 소스 코드를 분석하여 어셈블리 코드로 변환합니다. 이때, 오류가 발견되면 해당 오류 메시지를 출력합니다.
- 어셈블링(assembler) : 어셈블러는 어셈블리 코드를 기계어로 변환합니다.
- 링킹(linker) : 링커는 컴파일된 코드와 라이브러리 코드를 합쳐서 실행 파일을 생성합니다.
- 실행(executable): 생성된 실행 파일을 실행하여 프로그램을 실행합니다.
[정적 세그먼트]
- 코드 영역(Code segment) 코드 영역은 프로그램 실행 코드가 저장되는 영역이다. 이 영역은 읽기 전용 메모리로서, 프로그램이 실행될 때 메모리에 로드되며, 프로그램이 종료될 때까지 유지된다. 이 영역의 크기는 프로그램의 크기에 따라 결정된다.
- 데이터 영역(Data segment) 데이터 영역은 프로그램에서 초기화된 전역 변수와 정적(static) 변수가 저장되는 영역이다. 이 영역은 프로그램이 실행되기 전에 정적으로 할당되며, 프로그램이 종료될 때까지 유지된다. 이 영역은 초기값이 할당되어 있으므로, 초기화되지 않은 변수는 0으로 초기화된다.
[동적 세그먼트]
- 힙 영역(Heap segment) 힙 영역은 프로그램 실행 중에 동적으로 할당된 메모리가 저장되는 영역이다. 프로그램이 실행 중에 프로그래머가 동적으로 메모리를 할당하고 해제할 수 있다. 이 영역은 프로그램의 실행에 따라 크기가 변할 수 있다.
- 스택 영역(Stack segment) 스택 영역은 함수의 지역 변수, 매개 변수, 함수 호출 및 반환 정보 등이 저장되는 영역이다. 스택은 후입선출(Last-In-First-Out, LIFO) 구조로 되어 있으며, 함수 호출 시에 새로운 스택 프레임이 생성되어 스택에 저장된다. 함수의 실행이 완료되면 해당 스택 프레임이 제거되어 스택에서 제거된다. 이 영역은 스택의 크기를 미리 정해 놓으며, 초과할 경우 스택 오버플로우(Stack overflow)가 발생할 수 있다.
이번에 C++ 기술면접 예상질문을 알아보며 포스팅으로 정리 하면서 새로알게되거나 알고 있었지만 딥 하게는 몰랐던 부분들을 많이 채울 수 있었것 같아서 좋았고 나중에 다시 찾아서 복기해 보기도 좋을 것 같다.