본문 바로가기

Language/C C++

[C/C++] Declaration VS Definition Declaration은 변수의 이름, 타입, 초기값(있다면)에 대한 정보를 컴파일러에게 알려주는 것이다. 즉 선언이란 한 변수의 속성에 대해 자세한 내용을 제공하는 것이다.Definetion이란 변수가 어디에 저장되어있는지, 즉 변수가 메모리 어디에 할당되는지를 말한다.C에서 변수에 대한 선언과 정의는 동시에 일어난다.int a;a라는 변수에 이름(a)과 타입(int)같은 정보가 컴파일러로 보내져 심볼테이블이라는 자료구조에 저장될 것이다. 이를 통해 메모리에는 4byte가 할당될 것이다.변수의 선언은 일어나지만 정의는 일어나지 않는 경우를 보자. 바로 extern 키워드를 사용할 때 이다.xxxxxxxxxxextern int a;extern 키워드는 다른 파일에서 미리 정의된 변수 이름을 가져올 때 사용..
[C++] std::map 흔히 사용하는 key-value 자료형이다. C++에서는 #include으로 사용할 수 있다.std::map m;주요 함수삽입xxxxxxxxxxm.insert(make_pair("a", 100));m.insert(make_pair("c", 400));m.insert(make_pair("d", 200));m.insert(make_pair("b", 300));삭제xxxxxxxxxxm.erase("a"); // key 또는 iterator검색​xm["b"] //value​// find는 iterator를 반환한다.m.find("b")->first; //keym.find("b")->second; //value이 때 key에 해당하는 값이 없다면[]연산자는 0을 반환한다.find는 end() iterator를 반..
[C++] std::endl 알고리즘 문제를 푸는데 시간초과가 계속 발생했다. 정답 코드를 검색해서 비교해봤을때 내 코드와 다른 부분은 출력부분 뿐이었다. 나는 개행을 std::end를 사용했다.​xfor (int i = 0; i
[C++] 클래스 표준 입출력 C++의 연산자 오버로딩을 활용해 클래스를 직접 cin, cout에 사용할 수 있다.xostream& operator
[C++] Reference(1/2) C/C++에서는 데이터를 관리하기 위해 기본적으로 두 가지 종류의 저장소를 제공한다. 변수 포인터 : 포인터는 다른 저장소를 가리키는 메모리 주소를 저장한다. 주로 크기가 일정하지 않은 문자열이나 배열 등에 사용한다. C++은 여기에 참조(Reference)라고 하는 특수한 종류의 변수가 존재한다. 참조는 일반 변수의 저장소를 공유하기 위해 만든 실제 변수가 아닌 컴파일러가 인지하는 가상 변수를 말한다. C++의 포인터는 메모리 주소에 직접 접근해서 데이터를 읽고 수정할 수 있다. 이를 통해 비교적 크기가 큰 데이터를 빠리게 처리할 수 있다. 일반 객체지향 언어는 포인터를 제공하지 않는다. 대신 가상 포인터와 가상테이블을 사용하여 필요에 따라 서로 다른 데이터 저장소를 가리킨다. int, float같은 ..
[C++] 클래스 생성자 클래스의 인스턴스를 생성할 때 반드시 생성자가 호출된다. 생성자를 통해 클래스가 어떻게 생성되는지 살펴보자.암시적 생성자와 명시적 생성자객체를 생성하는 방법은 클래스 내 멤버을 어떤 방식으로 초기화하느냐에 따라 호출되는 생성자가 달라지게 된다. 아래 예시 코드를 통해 알아보려 한다.아래와 같은 Point 클래스를 정의해보았다.x#include class Point{public: int x; int y;​ Point() : x(0), y(0) { printf("Point() called!\n"); }​ Point(int x) : x(x), y(0) { printf("Point(int x(%d)) called!\n", x); }​ Point(int x, int y) : x(x), y(y) { printf("..
[C++]inline 함수 [C++]inline 함수기본적으로 함수 호출은 메모리상의 점프를 이용하며, 여러가지 상태 정보등을 저장하고 복원해야 하므로 내부적으로 복잡한 과정을 거친다. 프로그램이 실행되며 한줄씩 수행해 나가다가 함수 호출을 만나면 해당 함수의 메모리 영역으로 이동후 동작을 수행한다. 하지만 인라인 함수는 해당 함수 호출을 함수의 코 저체를 호출한 코드 위치로 모두 복사하여 대체한다. 따라서 함수 호출 단계가 줄어 복잡한 과정이 생략되므로 함수 동작 방식이 더 간단해지고 성능이 향상된다. 하지만 인라인함수가 항상 좋은것은 아니다. 인라인 함수는 코드를 대체하는 것이기 때문에 해당 함수를 호출하는 구문이 많아질 수록 실행 파일의 크기도 커진다. 호출 구문이 모두 함수의 정의로 바귀어서 전체 코드 양이 늘어나기 때문이..
[C/C++]std::mutex [C/C++]std::mutex멀티 쓰레드를 이용한 프로그램을 작성할 때 공유 자원의 관리에 주의해야한다. 여러 쓰레드가 동시에 같은 데이터를 변경할 경우 의도하지 않은 결과를 초래할 수 있다. 이런 멀티 쓰레드 환경에서 발생하는 문제점을 동기화 메커니즘으로 해결할 수 있다.먼저 동기화를 사용하지 않을 경우 발생하는 문제를 살펴보자.#include //std::thread #include //printf() using namespace std; int sum = 0; void Add(int cnt) { for (int i = 0; i < cnt; i++) { sum += 1; } } void Sub(int cnt) { for (int i = 0; i < cnt; i++) { sum -= 1; } } in..