목록C++ (58)
Coding Memo
Fisher-Yates Shuffle (피셔 예이스 셔플) 알고리즘은 랜덤 값을 이용해, 배열을 uniform하게 섞을 수 있는 알고리즘이다. 한번 순환 (1 iterator)로 셔플을 완성할 수 있다. 매우 간단하다. 랜덤하게 숫자 하나를 뽑고 그 값을 인덱스로 치환한다음 그 값과 현재 값을 swap한다.// Fisher-Yates Shuffle Algorithmvoid Shuffle(std::vector& arr){ int n = arr.size(); for (int i = n - 1; i > 0; i--) { int j = rand() % (i + 1); swap(arr[i], arr[j]); }} 하나 주의할 점은 랜덤 값을 얻는 함수로 rand()를 사용했기 때문에 시드를 설정 해줘야 한..
Dynamic Library (dll) - dllexport / dllimport (MSVC)__declspec(dllexport)와 __declspec(dllimport)는 MSVC(Microsoft Visaul C++) 컴파일러에서 사용하는 키워드이다. 동적 라이브러리(dynamic library)에서 클래스나 메서드, 변수를 내보내거나 가져올 때 사용된다.(보통 Windows에서 사용하고, GCC나 Clang에서는 __attribute__((visibility("default"))) 등을 사용) 간단히 말하면, 라이브러리에서 dll을 빌드할 때는 __declspec(dllexport) 키워드를 클래스 이름이나 메서드 원본 앞, 멤버 변수 앞 등에 붙여서 해당 내용을 외부에서 사용하도록 내보내겠다는 ..
문제 소켓이 연결이 되었음에도 불구하고, getpeername() 함수가 SOCKET_ERROR를 반환하고, WSAGetLastError() 값이 10057(WSAENOTCONN)이었다. 해당 소켓에 대해 WSASend 및 WSARecv는 정상적으로 작동하였고, getsockname또한 정상적으로 작동하였다. 해결 연결된 소켓에 대해 SO_UPDATE_CONNECT_CONTEXT 옵션을 설정해 주면 된다.이후 getpeername은 정상적으로 작동하고, remote endpoint의 주소와 포트 번호를 가져올 수 있다. 설명 SO_UPDATE_CONNECT_CONTEXT는 소켓이 연결 된 이후에, 소켓의 속성을 업데이트하는 옵션이다. 이 옵션은 ConnectEx, WSAConnectByList, WSA..
윈도우에서 지원하는 concurrent에 대한 자료구조 헤더가 있는데, 이들은 lock-free로 구현되어 있으니 이 쪽을 사용하는 것이 훨씬 더 도움이 될 수도 있겠다 ㅋㅋ std::mutex를 이용한 lock과 std::priority_queue를 사용하여 간단한 concurrent 우선순위 큐를 만들어보았다.기본적인 push 및 pop 외에, 지정된 조건에 따라 결과값을 반환하는 TryPop등의 함수도 포함했다.상황에 따라 필요할 수도 있기 때문이다. (예를 들어, top의 객체를 확인하고 이 객체가 어떤 조건이 맞을 경우에만 pop을 해야할 필요가 있을 때, top과 pop을 따로하면 atomic하게 실행시켜야되는 데, 이 과정에서 외부 lock을 걸어야 되기 때문이다.) 추가적으로, 이동연산자를..

Summaryconst로 선언된 포인터는 포인터 값 뿐만 아니라, 해당 포인터가 가리키는 데이터의 변경도 막는다. 따라서 const 변수와 마찬가지로, const 포인터는 const가 아닌 값으로 캐스팅 할 수 없다. const로 선언된 포인터는 해당 포인터가 가리키는 데이터의 변경을 막는다. 만약, const 포인터가 가리키는 값을 변경할 필요가 있는 경우, `const_cast`를 사용하여 const 속성을 없애주면 된다.다음은 예시 코드이다.using uint = unsigned int;using ubyte = unsigned char;uint t = 0xffffffff;std::cout someInt(4, 0xFF); // it represents max of unsigned int { uby..
일단은 해당 내용은 에러나 경고로 나타나지 않고, 단순히 output에서 나타난 일종의 메시지 이다.the template instantiation context (the oldest one first) is 1> ...Session.cpp(49,23): 1> see reference to function template instantiation 'std::shared_ptr NetCore::make_shared,NetCore::_ubyte*&,const size_t&>(std::shared_ptr &&,NetCore::_ubyte *&,const size_t &)' being compiled 1> with 1> [ 1> _Ty=NetCore::Send..
상황 GetQueuedCompletionStatus()가 성공적으로 완료되었음에도 불구하고, Overlapped 구조체의 값이 이상했다. (기대했던 값이 아니었다.) GetQueuedCompletionStatus를 호출한 HANDLE에 `connectEvent`라는 overlapped를 상속하는 구조체가 연결되어 있는 파일 핸들을 등록했다. 따라서 GetQueuedCompletionStatus가 성공적으로 완료되었다면, 인자로 넣어주었던 LPOVERLAPPED*가 이 connectEvent를 가리키는 포인터가 되어야 된다. 그러나 이 포인터는 메모리 오염이 일어난 듯 값이 이상했다. 먼저, IOCPEvent와 ConnectEvent는 다음과 같다.// EventType은 unsigned ..
에러 Lock을 이용한 Queue를 만들고 컴파일 중에 발생했다. 일단 에러 내용은 이러하다. 상황 단순히 보면 ReadLock이라는 함수의 인자가 일치하지 않아서 나타나는 문제로 보인다... bool TryPeek(T& top) const { ReadLock __r_lock(_lock); // 문제의 코드 if (_queue.empty()) return false; else { top = _queue.top(); return true; } } 문제가 되는 함수이다. 간단히 설명하면, queue에서 peek을 하기위해 readlock을 걸어두고 queue를 읽는다. class ReadLock { public: ReadLock(Lock& lock) : _lock(lock) { _lock.ReadLock()..