C언어
-
컴파일 전 처리 (전처리기)C언어 2020. 3. 28. 15:32
전처리기란 ? 그동안 ~~~.c 와 같은 형태의 프로그램 파일을 작성하여 컴파일 하고 컴파일 된 오브젝트 파일을 링크하여 실행파일을 만들고 해당 실행파일을 Load 하여 실행하였을 것이다. 이때 컴파일 전에 처리하는 과정이 하나 있는데 이 과정을 전처리 과정이라 한다. 이 전처리 과정은 #include 라는 것을 작성하여 " 해당 구문은 컴파일 전에 처리해주세요 ~ " 라는 의미로 사용한다. ~~~.c : 프로그램의 실질적 동작이 기술된 정의 파일 ~~~.h : ~~~.c 파일에서 사용한 외부의 함수, 자료들이 선언된 파일 그동안 스탠다드 I/O 헤더파일에 정의 된 함수인 prinf, puts, gets 등의 표준 입출력 함수를 사용해 왔을 것이다. 이때 이러한 표준 입출력 함수는 사용자가 만들지 않고 ..
-
컴파일 최적화C언어 2020. 3. 27. 20:34
최적화란 ? 최적화 쉽게 말해 가장 알맞는 상태로 맞춘다는 의미이다. 그렇다면 누가 어떻게 무엇을 알맞는 상태로 맞춘다는 것인가 누가 ? 컴파일러가 어떻게 ? 쓸데없는 동작은 빼면서 무엇을 ? 코드에서 쉽게말해 컴파일러라는 도구가 작성된 코드를 분석하여 쓸모 없거나 비효율적인 동작을 파악하고 효율적은 코드로 탈바꿈 시켜주는 것을 이야기 한다. 아래 예를 한번 살펴보자 int main(int argc, char *argv[]){ // 변수 b는 변수 a에 대해 의존적이다. int a = 10; int b = a * 5; // 변수 d는 변수 c에 대해 의존적이다. int c = 20; int d = c * 5; // 변수a와 변수b는 변수c와 변수d와 서로 의존적이지 않다. // 즉 순서를 바꾸거나 동시에..
-
메모리 구조C언어 2020. 3. 16. 15:19
저번 포스트에서 사용자가 작성한 C 프로그램이 어떤 과정을 통해서 실행파일이 되는지 다루었다. 또한 이렇게 만들어진 실행파일은 실행 될 때 Load 과정을 통해 메모리 영역에 담긴다고 하였다. 이번 포스트에서는 이렇게 생성된 실행파일이 어떻게 메모리에 들어가게 되는지에 대해 다룰것이다. 그전에 C언어로 작성한 파일을 실행 파일로 바꾸는 과정을 잠깐 살펴보자 1. C 언어 프로그램 작성 2. 선처리 과정을 통한 프로그램의 실질적 동작을 나타내는 코드와, 추가적인 정보를 나타내는 부분을 분류 3. 컴파일 과정을 통해 해당 코드가 바이너리 형태로 생성 즉 바이너리 파일이 생성 4. 링크 과정을 통해 해당 바이너리 파일과 외부에서 가져온 기능이 있는 바이너리 파일을 합쳐서 실행파일 생성 위와 같은 과정을 통해 ..
-
C 프로그램의 동작 과정C언어 2020. 3. 16. 13:09
이번 포스트에서는 C 언어로 작성한 프로그램이 어떤식으로 동작하는지에 대한 순서를 살펴볼 것이다. 1. Editor 를 이용한 프로그램 작성 ( C언어로 작성 된 파일 ) EX ) 비쥬얼 스튜디오 같은 에디터로 C언어를 이용하여 프로그램을 작성한다 ( 함수, 변수, 조건문, 반복문 등을 이용해 작성 ) 2. Compiler 를 이용한 오프젝트 파일 생성 ( 바이너리 형태로 작성 된 코드 ) Editor 로 작성한 (C 언어 형태) 프로그램을 컴파일러를 사용해 컴퓨터가 인식할 수 있는 바이너리 형태로 작성 된 파일을 생성 한다는 의미이다. 이때 컴파일과정 내부는 2단계로 나눌 수 있다. 1 단계 Preprocessor (전 처리기) : 컴파일시 가장 먼저 수행 되는 과정으로 선처리 과정을 의미한다. 이 선..
-
스택 프레임 & 재귀함수C언어 2020. 3. 13. 06:00
OS는 하드웨어 자원 중 하나인 메모리를 하나의 논리적 메모리로 관리한다. 이렇게 관리하는 것이 가상메모리 시스템이다. 이런 가상메모리는 내부적으로 커널영역과, 유저영역이 나뉘어 지며 사용자에게 허용되는 영역은 유저영역이다. 유저영역은 내부적으로 여러 공간으로 나뉘어서 관리되고 있다. 이번 포스트에서는 그중 스택영역에 대해서 설명 할 것이다. 스택 프레임 함수내부의 즉 스코프 안의 영역에서 선언 되는 변수, 매개변수는 자동변수이며 변수의 메모리할당, 반환의 과정을 OS가 자동으로 관리해 준다고 하였다. 또한 이러한 자동 변수를 관리하는 메모리가 바로 Stack 영역의 메모리인 것이다. 따라서 프로그래머라면 Stack 메모리가 어떻게 관리되는지 정확이 이해할 수 있어야 한다. 이러한 관리 형식을 스텍 프레..
-
포인터의 이해C언어 2020. 3. 7. 21:15
이번 포스트는 포인터에 대해서 조금더 확실하고 어떤식으로 포인터를 연산하는지에 대해서 더 자세하게 다룰 것이다. 위의 자료는 포인터가 어떤 역할을 수행하는지 나타낸다. 가장먼저 pn 변수를 강제 자료형 변환을 시켰을 때 이다 이때 변환한 자료형은 int *로 기술하였다. 다음과 같이 변수를 포인터로 형변환 시키면 변수에 담긴 값 (주소)에 해당하는 메모리에 내용을 int로 해석하겠다는 의미이다. 따라서 pn 변수에는 1이 있으므로 1을 주소로 인식하며 해당 주소에 있는 메모리의 값은 int로 해석하게된다. 다음은 변수 a에 대한 주소를 강제 자료형 변환 시켰을 때 이다. 위와 마찬가지로 int *으로 기술. 따라서 &a에 대한 연산 결과인 a 변수의 주소가 주소인 형태로 상수화 되면서 해당 상수화 된 주..
-
배열의 이해C언어 2020. 3. 5. 19:54
수정 필요 이번 포스트에서는 한가지 재미있는 주제에 대해서 다룰것이다. 바로 char ch[10] = { "Hello" } 와 같이 문자(배)열을 선언과 동시에 "Hello" 라는 문자열 상수로 초기화 하였을 때 내부적으로 어떤 과정을 통해서 문자 배열 ch에 "Hello" 라는 문자열 상수가 들어가는지에 대해서 다룰 것이다. 위의 내용을 다루기 앞서 자료형의 개념에 대해서 다시 짚고 넘어가면 다음과 같다. 자료형은 일정 길이의 메모리에 있는 자료 또는 정보를 해석하는 방법이라고 하였다. 즉 메모리에 61 이라는 값이 있다고 하면 이 값을 int 로 해석하면 부호있는 10진 정수 61이 되는 것이고 반대로 char로 해석하면 61이라는 값은 'a' 라는 문자로 해석이 될 수 도 있다는 의미이다. 위와 같..
-
메모리 복사C언어 2020. 3. 5. 18:24
이번 포스트에서 다룰 내용은 메모리에 담긴 값을 복사하는 방법에 대해서 다룰 것이다. 가장 쉽게 복사하는 방법은 단순대입 연산자를 통하여 r - value 의 값을 왼쪽의 l - value 의 값으로 옮기는 방법이다. int main(void) { int num = 10; int cp_num = 0; cp_num = num; printf("%d", cp_num); } 또한 l-value의 값은 항상 변수만 가능하다. 따라서 cp_num 이라는 변수에 0이라는 값을 over write 하고 num이라는 변수에 있는 10이라는 값을 새롭게 넣은 것이다. 그렇다면 이러한 인스턴스들의 집합은 어떻게 복사해야 하는가 ? 즉 배열의 경우 어떻게 복사하여야 하는가 ? 라는 의문이 생긴다. 한번 위의 경우와 같이 복사..