728x90

전체 글 148

[C++] 컴파일 과정

1. hello.c 라는 코드 파일이 있다고 할 때, 과정을 간략히 본다면... 1) hello.c 프로세서 (gcc -E -o test.i test.c) 2) hello.i 컴파일러 (gcc -S -o test.s test.i) 3) hello.s 어셈블러 (gcc -c -o test.o test.s) 4) hello.o 링커 (gcc -g -o test test.o) 5) hello.out (실행 파일) 2. 각 과정에서 하는 기능 1) 전처리기 - 소스 코드의 주석을 제거, define을 치환하는 과정 수행 2) 컴파일러 - 어셈블리 파일로 전환 - 어셈블리 코드는 CPU 명령 조합 (어셈블리어는 CPU에 의존적) - front-end > 프로그래밍 언어를 처리 > 소스 코드가 문법에 맞게 작성되었..

Language/C++ 2020.12.15

[C++] 전처리기

1. 전처리기(Preprocesser) - 프로그램을 컴파일 할 때 컴파일 직전에 실행되는 별도의 프로그램. - 전처리가 실행되면 각 코드에서 지시자(directives)를 찾는다. - 지시자는 #으로 시작해서 줄 바꿈으로 끝나는 코드이다. - 전처리기는 컴파일러가 실행되기 직전에 단순히 텍스트를 치환하는 역할을 하기도 하고, 디버깅에도 도움을 주며 헤더 파일의 중복 포함도 방지해주는 기능을 가진다. 1) Include - #include 를 하면 전처리기는 포함된 파일된 내용을 지시자 위치에 복사한다. - 는 컴파일러와 함께 제공되는 헤더 파일을 include할 때 사용한다. * 위 헤더 파일은 C++런타임 라이브러리의 헤더 파일로써 운영체제의 특별한 위치에 존재. - "" 는 소스 파일이 있는 디렉토..

Language/C++ 2020.12.13

[C++] 입출력 속도

1. std::ios::sync_with_stdio(false); - C 표준 stream과 C++ 표준 stream의 동기화를 하지 않는다. - 기본적으로 모든 표준 stream들은 동기화되어 있다. 그래서 C와 C++의 입출력방식을 자유롭게 사용할 수 있다. - 동기화를 하지 않는다면 C++의 stream들은 독립적인 버퍼를 갖게 되며, C와 C++의 입출력방식을 혼용해서 쓰는 것이 굉장히 위험해진다. - 동기화된 C++의 stream은 thread-safe 하다. (다른 thread의 output이 동시에 액세스해도 충돌하지 않는다.) - 동기화를 하지 않으면 사용하는 버퍼의 수가 줄어들기 때문에 실행 속도 자체는 향상된다. 2. cin.tie(NULL) - cout > name; 의 순서는 원래 ..

Language/C++ 2020.12.13

[C++] 얕은 복사와 깊은 복사

1. 얕은 복사 - 얕은 복사는 객체가 가진 멤버들의 값을 새로운 객체로 복사하는 데 만약 객체가 참조 타입의 멤버를 가지고 있다면 참조값만 복사가 됨. - e.g) Person(const Person& s) { age = s.age; name = s.name; } 2. 깊은 복사 - 전체 복사 - 얕은 복사와는 달리 객체가 가진 모든 멤버(값과 참조형식 모두)를 복사하는 것. - 객체가 참조 타입의 멤버를 포함할 경우 참조값의 복사가 아닌 참조된 객체 자체가 복사되는 것. - e.g) Person(const Person & s) { age = s.age; name = new char [strlen(s.name)+1]; strcpy(name, s.name); } -> name 객체가 참조형이기 때문에 새..

Language/C++ 2020.12.13

[C++] 스마트 포인터

1. 스마트 포인터 - 동적으로 할당된 메모리를 자동으로 해제시켜주는 클래스 1) auto_ptr - 동적으로 할당된 메모리도 자동으로 해제하는 기능을 가진 포인터 래퍼 클래스. - memory 헤더 파일을 포함시켜야 한다. #include - 단점 > malloc으로 할당한 경우는 자동 해제를 못 한다. (이 경우 새로 클래스를 만들어야 한다) > 에 [] 연산자를 지원하지 않는다. - 선언 형태 auto_ptr 변수명(new 자료형); - auto_ptr은 포인터와 같이 4 byte를 가진다. 2) unique_ptr - 하나의 스마트 포인터만이 특정 객체를 소유할 수 있도록 객체에 소유권 개념을 도입한 스마트 포인터. - shard_ptr과 달리 참조 카운트가 1을 넘을 수 없다. > unique_..

Language/C++ 2020.12.13

[C++] 가상함수

1. 가상 함수 - 파생 클래스에서 재정의할 것으로 기대하는 멤버함수 - 자신을 호출하는 객체의 동적 타입에 따라서 실제 호출할 함수가 결정된다. - 기초 클래스에서 virtual 키워드를 사용해 가상 함수를 선언하면, 파생 클래스에서 재정의된 멤버 함수도 자동으로 가상 함수가 된다. 2. 순수 가상함수 - 구현이 없는 가상함수를 뜻 함. - 구현 대신 가상함에서 NULL(0) 값을 대입하면 해당 함수는 순수 가상함수가 된다. - 순수 가상함수를 포함하는 클래스는 추상 클래스로 지정. - 자식 클래스가 재정의를 하지 않으면 오류가 발생함.

Language/C++ 2020.12.13

[C++] 선언과 정의

1. 선언 (Declaration) - 식별자(변수 또는 함수 이름) 및 해당 타입의 존재를 컴파일러에 알려주는 명령문(Statement)이다. - 선언하지 않고 식별자를 사용하면 컴파일러에서 오류가 발생한다. 2. 정의 (Definition) - 식별자를 실제로 구현하거나 인스턴스화(메모리 할당) 한다. - 링커를 만족하게 하기 위해서는 정의가 필요하다. - 정의하지 않고 식별자를 사용하면 링커에서 오류가 발생한다. - C++에서 모든 정의는 선언으로 간주한다. (int x; 는 정의이기 때문에 기본적으로 선언이다.)

Language/C++ 2020.12.13

[C++] 변수 크기와 sizeof() 연산

1. 변수 크기와 sizeof() 연산자 - 메모리는 일반적으로 byte 단위로 구성되며, 각 단위는 고유한 주소를 가진다. - 변수는 보통 메모리를 1 byte 이상 차지한다. 1) 변수가 더 많은 메모리를 차지할 수록 더 많은 정보를 저장할 수 있다. : 각 bit는 0 또는 1의 정보만을 가지기 때문에 1 bit가 가질 수 있는 값의 경우의 수는 2개이다. 2) 컴퓨터가 사용 가능한 메모리양은 한정되어 있으므로, 자료형에 따른 변수의 크기가 중요하다. 3) sizeof() : 자료형 또는 변수를 가지고 크기를 byte 단위로 반환하는 연산자 2. C++ 기본 자료형의 크기 - boolean (1 byte) - character char 1 byte wchar_t 1 byte char16_t 2 by..

Language/C++ 2020.12.13

[C++] 다양한 변수 초기화 방법

1. 복사 초기화 - int value = 5; 2. 직접 초기화 - int value(5) - 직접 초기화는 함수 호출과 매우 유사하지만, 컴파일러는 어떤 이름이 변수이고 어떤 이름이 함수인지를 추적해 제대로 컴파일 한다. - 직접 초기화는 일부 데이터 타입에서 복사 초기화보다 성능이 뛰어날 수 있다. 클래스에 관해선 다른 이점도 있다. 또한, 초기화와 할당을 구분하는 데 도움이 된다. 3. C++ 11의 유니폼 초기화 - '중괄호 {}' 를 사용한 유니폼 초기화 - 복사 초기화 및 직접 초기화는 일부 타입 변수에 대해서만 작동한다. - 모든 데이터 타입에서 작동하는 단일 초기화 메커니즘을 제공하기 위해 C+11은 유니폼 초기화라는 새로운 형태를 제공한다. - e.g) int value{5}; int ..

Language/C++ 2020.12.13
반응형