🔥 Programming/C++
[C/C++] 동적할당 malloc, calloc, realloc들의 차이란?
1. malloc return 타입이 void*인 void형 포인터이다. 동적할당을 하게될 경우 return할때의 자료형을 명시할 수 없기에 void 형 시작주소를 return 한다. malloc은 단순히 void형 시작 주소를 반환하기에 우리가 필요한 자료형으로 아래와 같이 형변환해서 사용해주어야한다. 처음 malloc을 하게 되면 할당된 메모리를 초기화 하지않기에, 쓰레기값이 들어있다. malloc 이후 memset 등을 이용하여 메모리 초기화를 시켜주어야한다. 2. calloc return 타입이 malloc과 같은 void형 포인터이다. 동작방식이 매우 비슷하며, 입력 파라미터에 size_t num이 추가되어 있다. 동적 메모리 생성하는 개수를 추가해주어 사용한다. 다만 다른점이 있다면, mall..
[C/C++] C++ auto keyword의 장점과 단점
서론 C++ 에서는 auto라는 keyword가 있다. 쉽게 설명하자면, 타입을 명시적으로 쓰지 않아도, 코드에 맞게 자료형을 추론해주는 키워드이다. C#에서는 var 변수가 위 설명된 auto와 명시적으로 정의를 해주지 않는다는 점에서는 동일합니다. 저에게는 var 변수가 더 익숙하기에 auto에 대해 이해를 할 때 var와 비슷한 역할을 한다는 정의를 보았을 때 이해가 빨랐습니다. auto 키워드는 컴파일러가 컴파일 하는 과정에서 자료형을 결정해주기 때문에, 반드시 선언과 동시에 초기화를 해주어야한다. 아래의 이미지를 보자. 또한 컴파일 과정에서 자료형을 결정해준다는 것은 자칫 잘못하면 해당 자료형의 추적이 어려울수도 있고, 직관성이 떨어질 수도 있다. 아래 이미지를 보자. 컴파일 과정에서 자료형을 ..
[C/C++] C++ 벡터 사용시, () 선언과 [] 선언의 차이
C++ 에서 vector를 선언할 시, 크기 선언을 ()괄호로 하는 방법과, []괄호로 하는 방법이 있다. 이 두가지 선언 방법의 차이점 []괄호로 크기 선언시 해당 벡터의 원소 인덱스 마다 동적으로 크기 할당을 할 수 있다. ()괄호로 크기 선언시, 선언한 크기만큼 공간을 만든 후, 초기화를 한다. 즉, [] 괄호는 크기가 동적으로늘어나나, 텅 빈 배열이라 보면 되고, () 괄호로 선언 시, 해당 크기만큼만 초기화를 시켜준다. 예시 [] 괄호로 벡터 선언시 #include #include using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); vector vec[100]; for (int i..
[C/C++] C++ 배열 초기화 (std::fill_n, std::fill, memset)
C++ 배열 초기화 보통 C++로 코딩을 하거나, C#으로 코딩을 할때 각각 vector와 List를 많이 사용하지만, 자료구조 문제를 풀때는 고정된 크기만큼 할당을 해야하는 조건이 붙는 경우가 많다. ex) 조건 1. 배열의 크기는 1000보다 작아야한다. 위와 같은식으로 조건이 붙는다. 하지만 간단한 배열은 초기화를 해주면 되지만, 배열의 크기가 클 경우에는 일일히 초기화가 아니라 간단히 초기화 해줄 수 있는 방법이 C++에서 제공된다. std:fill 해당 함수의 매개변수는 아래와 같다. void fill(const _FwdIt _First, const _FwdIt _Last, const _Ty& _Val) 첫 인자인 first 부터 last까지 마지막 Type val로 채운다는 뜻이다. 해당 fi..
[C/C++] C++ ios_base::sync_with_stdio(false), cin.tie(0)
ios_base::sync_with_stdio(false), cin.tie(0) 위의 두 구문을 사용하게 되면 연산속도가 빨라진다는 것은 다들 알고 계실겁니다. sync_with_stdio sync_with_stdio는 C++ 표준 스트림들이 C 표준 스트림들과 입출력 연산 후 동기화 할지 여부를 정해주는 것입니다. 예를들면 C++의 경우, std::cin, std::cout, std::cerr 등이 있고, C의 경우, stdin, stdout, stderr이 있습니다. 즉 동기화된 C++ 스트림이 버퍼링 되지않고 C++ 스트림에 각 I/O 작업이 해당 C 스트림 버퍼에 즉시 적용됩니다. 해당 ios_base::sync_with_stdio(false) 구문을 사용 하지 않을 경우, C++ 과 C의 버퍼를..