프로그래밍/의문
-
비교문에서 상수를 왼쪽에 써야 하는 사람들의 주장프로그래밍/의문 2020. 6. 14. 22:19
int a = 0; if (a = 10) { /// 항상 true } if (10 = a) { /// 상수에 a를 대입? 컴파일러가 오류를 띄움. } ==를 이용한 비교 시 == 중 =를 실수로 뺄 경우 발생하는 이슈를 방지할 수 있기 때문에. 개인적인 기호로는 a == 10이 더 좋음. 각각 a equals 10, 10 equals a 인데, 전자가 더 자연스럽다고 느끼기 때문에. for문에서 ++i, i++ 만큼 더이상 의미 없는 주장 아닐까 하는 생각을 함. "우리 프로젝트의 컨벤션이니까"라고 말하는 게 더 공감하기 좋다고 생각 한다.
-
게임에 가장 적합한 유사 난수 발생기(PRNG)는 뭘까프로그래밍/의문 2019. 11. 1. 18:51
일단 하드웨어 Random은 직접 Random으로 사용하는 게 아니다. 그 이유에 대해선 아래의 글을 참고. https://stackoverflow.com/questions/39288595/why-not-just-use-random-device c, c++에서의 rand() 함수도 고려 대상이 아니다. 일단 rand의 자체의 정밀도는 게임에 쓰기에 큰 무리 없다고는 생각하지만, 가장 문제되는 것은 랜덤 스테이트를 컨텐츠 별 지역화도 할 수 없다는 것 그리고 단일 호출로 발생되는 난수의 범위가 너무 작다는 것이다. Visual Studio 2019 기준 rand()가 반환하는 최대 값은 32767(RAND_MAX)으로, 이것을 강제로 스케일링 해서 원하는 최대 값에 맞춰도 값은 어차피 최대 값 까지 327..
-
FlatBuffer streaming 통신프로그래밍/의문 2019. 8. 11. 04:28
원했던 동작 별도의 패킷 헤더를 붙이지 않고 FlatBuffer 바이너리만 송신한다. 사전 작업 FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE를 정의한다.(#define FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE) (Verifier의 GetComputedSize를 사용하기 위해) 방법 1. flatbuffer::Verifier를 이용하면 패킷이 완성되었는지 체크한다. 2. flatbuffer::Verifier::GetComputedSize()를 사용해 메세지 사이즈 만큼 읽기 인덱스를 뒤로 넘긴다. 샘플 코드 FlatBufferBuilder builder; auto serializedPacket = CreatePacket( builder, PacketBa..
-
c# Regex의 패턴은 캐싱 된다.프로그래밍/의문 2019. 5. 10. 13:45
정규식이 함수 안에 있으면 정규식 인스턴스가 만들어질 때마다 패턴이 컴파일이 되는 건가 해서 Regex를 static 인스턴스로 만들어두고 사용했었다. static Regex regex = new Regex("My Pattern"); // ... bool IsValid(string str) { return regex.IsMatch(str); } 찾아보니 최근 사용한 15개 정도의 정규식은 캐싱된다고 한다. 캐싱된 정규식을 이용하려면 다음과 같이 하면 된다. bool IsValid(string str) { string pattern = "My Pattern"; return Regex.IsMatch(pattern, str); // 정규식 패턴 풀에서 가져옴 } https://docs.microsoft.com..
-
할당한 메모리가 working set에 잡히지 않던 현상프로그래밍/의문 2019. 4. 23. 23:32
내가 만든 서버를 띄우고 윈도우 작업 관리자에서 메모리 점유율을 확인하니 할당한 메모리에 비해 턱없이 적은 메모리가 잡히고 있었다. 적어도 1gb는 잡혔어야 했는데 약 180mb만 잡혔던 것이다. 할당이 안 되고 있던 건가 했는데 그건 아니었고, 혹시나 해서 Virtual memory size를 확인해보니 거기에는 잡혀있더라. 메모리 엑세스가 되지 않아서 그런 걸까? 그럼 억지로 메모리를 엑세스 해 Working set으로 올라가지 않을까? 라는 생각에 memset을 이용해 할당한 메모리에 접근하도록 해봤다. // 테스트를 위한 메모리 강제 접근 memset(recvbuf.ptr(), 0, recvbuf.size()); memset(sendbuf.ptr(), 0, sendbuf.size()); 그러자 실..
-
boost asio 사용 시 win32 버전을 지정하지 않으면 io_context::run이 빠져나가는 현상프로그래밍/의문 2019. 4. 14. 04:09
asio를 이용해 tcp 서버를 만들었는데 async_accept 이벤트가 등록되어있음에도 io_context::run을 벗어났다. _WIN32_WINNT에 타겟 윈도우 버전을 지정하니 벗어나는 현상이 없어졌다.(_WIN32_WINNT=_WIN32_WINNT_WIN10) 추가적인 확인 필요 발생한 상황 서버는 최대 세션이 10개 받아지도록 되어있다. 세션이 끊어지면 소켓을 닫고 닫힌 소켓에 async_accept를 걸도록 되어있다. 클라이언트는 100개의 세션을 동시에 연결하고 동시에 연결을 끊는다. 서버는 다시 async_accept를 걸었다는 로그가 찍혀있지만 아무 에러 없이 io_context::run이 빠져나갔다. 다음과 같은 상황에선 발생하지 않았다. 위 상황에서 서버는 최대 세션이 110개 받..