본문 바로가기

C,C++/C++51

[C/C++] 인자로 넘겨받은 배열로는 배열의 크기를 구할 수 없다. 다음과 같이 배열이 주어지면 배열의 크기와 원소의 크기를 통해 배열의 길이를 알 수 있다. void main() { int arr[] = {1,2,3,4,5,6}; size_t arr_size = sizeof(arr)/sizeof(int); // 6 } 그런데 다음과 같이 함수의 인자로 배열을 넘겨받아서 위와 같이 계산하면 구할 수 없다. void Foo(int arr[]) { size_t arr_size = sizeof(arr)/sizeof(int); // 1 } void main() { int arr[] = {1,2,3,4,5,6}; Foo(arr); } 그 이유는 인자로 arr을 받을 때 배열이 아닌 포인터로 받기 때문이다. 즉 배열의 이름(주소)을 받는다. 그래서 분자가 배열의 크기가 아닌 포인터.. 2020. 8. 2.
[C++] std::thread 기본 활용 방법을 알아보자 | mutex, condition_variable, 종료 방법 개인적으로 공부하는 내용이므로 틀린 부분이 있을 수 있습니다. 있다면 알려주세요 :) 1. 공유 자원에 대한 race condition 해결하기 (mutex) 하나의 프로세스 내에 두 개 이상의 스레드가 존재하는 멀티 스레딩 환경에선 한가지 문제점이 존재한다. 바로 하나의 자원에 여러 스레드가 동시에 접근함으로 인해 생기는 문제점이다. 예를 들어 다음 프로그램은 10개의 스레드가 생성되면서 각자 Foo 함수를 실행한다. Foo 함수에선 s_num이라는 전역 변수를 증가시키고 감소시킨다. 따라서 결과 값은 0을 기대하지만 직접 실행해보면 항상 0이 보장되진 않는다. volatile 키워드는 테스트를 위해 임시적으로 컴파일러의 최적화를 차단해두기 위함이다. volatile int g_num = 0; void.. 2020. 7. 3.
[C++] std::thread 생성에 대해 알아보자 개인적으로 공부하는 내용이므로 틀린 부분이 있을 수 있습니다. 있다면 알려주세요 :) 1. 스레드 생성하기 (Create) C++에서의 스레드는 C++ 11에서 등장한 thread 클래스를 사용한다. 이전엔 각 OS에서 제공하는 스레드를 사용하였으며, 해당 스레드는 윈도우와 리눅스 모두 호환이 된다. 우선 스레드를 생성하기 위해선 헤더 파일을 인클루드 해주어야 한다. 그리고 다음과 같이 스레드를 생성한다. Foo 함수를 실행하는 스레드 생성 #include void Foo() {;} void main() { std::thread my_thread1(Foo); } PrintMessage 함수를 실행하는 스레드 생성 위 코드는 Foo() 함수를 실행하는 스레드를 1개 생성한 것이다. 만약 함수에 인자가 존재.. 2020. 6. 26.
특정 문자로 문자열 분리하기 | tokenizer "hello world" 또는 "hello, world" 라는 문자열이 있을 때 공백 또는 ','를 이용하여 단어 단위로 자를 수 있다. 이를 보통 token 단위로 나눈다 해서 tokenizing이라 한다. 여기선 getline() 함수와 stringstream 타입을 통해 간단하게 나누는 법을 알아본다. string 타입과 char* 타입 두 가지 모두 가능하다. stringstream 타입을 사용하기 위해 헤더파일을 인클루드 해줘야 한다. 아래는 두 문자열을 각각 공백과 콤마를 기준으로 분리하는 간단한 예제이다. // string과 char* 타입 모두 가능 std::string str1 = "hello world"; const char* str2 = "hello, world"; // 문자열을 통해.. 2020. 6. 23.
[C/C++] realloc 함수 사용 시 주의할 점 [realloc] realloc 함수는 malloc을 통해 할당된 메모리의 크기를 축소하거나 확장하고 싶을 때 사용한다. [realloc 사용 시 주의사항] void* realloc(void* ptr, size_t size); 1. realloc은 ptr이 가리키는 메모리 주소의 크기를 size 바이트로 확장 또는 축소한다. 만약 size바이트 만큼 연속된 메모리를 할당할 수 없을 경우 새로운 영역을 할당 후 기존 요소들을 복사하여 새 메모리 주소를 반환한다. 따라서 항상 ptr이 이전의 주소값과 일치한다고 말할 수 없다. 2. realloc은 size가 0이거나 size바이트만큼 할당할 수 없다면 ptr은 그대로 살려둔채로 NULL을 반환한다. 보통 realloc을 다음과 같이 사용하는데, 이 경우 기.. 2020. 4. 9.
[C/C++] malloc과 new의 차이와 동작 원리 개인적으로 학습용으로 작성하는 내용이라 틀린 부분이 있을 수 있습니다. [malloc 함수와 new 연산자] 우선 표면적인 가장 큰 차이는 malloc은 함수고 new는 연산자(operator)라는 것이다. malloc 함수는 바이트 단위의 Size를 인자로 받아 사용 가능한 메모리 공간의 시작 주소를 반환해준다. 물론 malloc은 메모리 공간의 요소들을 자동으로 초기화해주지 않는다. 기본적으로 쓰레기 값을 가진 메모리 주소를 반환한다. 특정 값으로 초기화를 원한다면 calloc 함수를 사용할 수 있다. 만약 Size로 들어온 크기만큼 할당할 수 없다면 NULL을 반환한다. malloc은 오로지 POD(Plain Old Data) 타입에 대해서만 크기를 할당해줄 수 있다. POD 타입이란 쉽게 말해 연.. 2020. 4. 7.