일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 코틀린
- http상태코드
- 바르셀로나
- HTTP
- kotiln
- 본식후기
- sprintboot
- 스페인 준비물
- 코프링
- HTTP #웹기술
- git명령어
- 코틀린 함수
- Srping AOP
- 스페인
- @Component
- b-tree index
- c# scv
- 아펠가모
- 아펠가모선릉
- 그라나다
- Kotlin
- db index
- 관심지향프로그래밍
- 스프링 AOP
- kopring
- 400에러
- 마드리드
- elk
- 아펠가모 선릉
- 세비야
- Today
- Total
목록C, C++, C# (32)
끄적이는 메모장
#mutex std::mutex 란 멀티 스레딩 상에서 하나의 자원에 대해서 두 프로그램이 읽기/쓰기를 할 때 발생할 수 있는 동기화 문제를 막기위해 공통으로 사용하는 자원에 lock을 걸어주는 역할을 수행해준다. 몇가지 기능으로 lock() - thread가 lock을 얻어오기 위한 기능, lock을 얻을 때 까지 대기 try_lcok() - thread가 lock 점유를 시도하고 성공(true), 실패(false)를 바로 반환 unlock() - lock을 해제함 당연한 말이지만 lock()을 동시에 호출하면 데드락 상황이 발생할 가능성이 큼 ex) static int count = 0; int main() { std::mutex m; std::thread t1([&] { for (int i=0; i
#std::bind참고 : http://egloos.zum.com/sweeper/v/3007638 std::bind(함수의주소, 인자1, 인자2, ....); 간단히 말하면 호출이 가능한 객체에 인수를 바인딩 하는 것 ex) void hello(const string& s) { cout
# lambda expression __ 오개념 수정은 환영합니다 (_._ ) lambda expression은 함수를 미리 선언하는 것이 아니라 필요할 때 일회성으로 사용 하는 것을 의미한다. lambda expression은 다양한 모양은 기본적으로 다음과 같다. [캡쳐블록] (인수목록) -> 반환형 {return 동작정의;}(인수값); 캡쳐 블록은 외부 변수를 사용할 때 괄호 내부에 외부변수를 나타내며, 외부 변수가 없는경우 괄호만 [] 표시한다. 인수 목록은 return을 위한 동작을 정의시 인수가 필요하다면 사용되며, 실제 값은 맨 뒤 인수 값을 통해 전달한다. 반환형은 명시적으로 지정할 수 있으며, 반환형이 없는 경우 return되는 반환 형으로 타입이 결정된다. (인수록목과 반환형은 생략이 ..
# range for loop 예를 들어 특정 벡터에 for loop 연산을 수행 하고 싶다. 1. 기존 vector temp_vector; for (vector::iterator v = temp_vector.begin; v != temp_vector.end(); ++temp_vector) { .... } 2. auto를 이용할 수 있다. 1 보다 조금 더 간단 해진다. vector temp_vector; for (auto v = temp_vector.begin; v != temp_vector.end(); ++temp_vector) { .... } 3. range for loop를 사용해보자 vector temp_vector; for (auto v : temp_vector) { .... } 단, 주의할 ..
#make_shared make_shared와 new의 사용 비교 auto work1(std::make_shared()); std::shared_ptr work2(new Test); new를 사용했을 때 1. Test라는 Type을 중복하여 두 번이나 사용해야 한다. 2. exception에 safety 하지 않을 수 있다. 2의 예시 void func2(std::shared_ptr p1, int a); -> func2(std::shared_ptr(new TEST), func1()); 이 함수가 실제 실행 되기 위해서는 a. new 를 TEST 객체 생성 b. 생성된 객체로 shared_ptr 생성 c. func1 실행 세 단계가 유효해야함 만약 a-c-b 순으로 실행되었는데! c 함수 실행 중 exce..
#shared_ptr 객체의 소유권을 다른 포인터와 공유 가능 -> 복사가 가능 reference count가 존재하는데 포인터가 복사될 때마다 1씩 증가하는 것으로 이해가능 그리고 참조가 사라질 때마다 1씩 감소하는데, reference count가 0이 되었을때 메모리가 해제된다. shared_ptr p1(new double(1.0)); -> reference count - 1 auto p2 = p1; -> reference count - 2 use_count : 현재의 reference count 값을 알 수 있다. ex ) p2.use_count() => 2 shared_ptr 객체가 복사 되는데 사용되는 메모리 크기는 어떻게 될까 ? -> 답은 증가 되지 않는다! 단지 증가 되는 것은 refer..
#smart pointer (스마트포인터) 1. 일반 포인터는 new를 이용하여 메모리를 할당 한 후 delete 연산을 호출 하지 않으면 메모리 누수가 발생한다. 2. 예기치 못하게 동적 할당된 메모리를 해제 할 수 없는 경우가 발생한다. => 스마트 포인터는 이러한 일반 포인터에서 발생할 수 있는 문제를 쉽게 해결하는 것에 도움을 주려고 등장했다. 헤더는 #incldue # auto_ptr 객체를 할당하면 초기화가 된다 std::auto_ptrfrist(new ExmplaeClass); frist 라는 스마트 포인터 객체가 생성 되었다 std::auto_ptrsecond(first); 이때, first라는 객체는 second라는 객체에 복사가 될까? 이동이 될까? 답은 이동이 된다. 즉, second..
#nullptr 기존 C++은 포인터 변수가 가리키는 주소가 없는 경우 NULL을 사용했다 void* p1 = 0; 0은 암시적으로 NULL을 의미함 만약 포인터를 인자로 받는 경우 NULL을 0으로 전달하는 경우 정수형 0으로 인식되는 문제가 발생할 수 있다. 즉 근복적으로 NULL 포인터의 값을 정수인 0을 사용했기 때문이고 C++11에서는 이를 해결 하기위하여 nullptr이 기존의 NULL을 대체하려고한다. nullptr의 타입은 실제 nullptr_t이다. 즉, 정수형과 호환이 될 수 없다. 단, boolean과 호환이 가능하고 nullptr이 false로서 사용이 가능하다. int main() { int* p1 = nullptr; nullptr_t p2 = nullptr; }