C++
-
const std::string& 대신 std::string_view프로그래밍/c++ 2018. 2. 20. 17:01
c++17에 추가된 std::string_view는 문자열을 소유하지 않고 참조만 한다.다음과 같은 선언을 가진 함수가 있다.void print(const std::string& str) print 함수의 호출을 다음과 같이 했다고 하자. print("hello world!"); 호출될 때, 내부적으로 std::string 클래스가 만들어지고, 내부적으로 할당된 메모리 배열에 hello world!를 의미하는 값들이 채울 것이다.1~2바이트의 텍스트만 담는데도 메모리 할당을 해버리면 매우 비효율적일 것이다. 컴파일러 중에선 얼마 안 되는 메모리의 경우는 스택의 메모리를 쓰고, 그 이상을 쓰려는 경우 그때서야 메모리 할당을 하는 기법을 쓰기도 한다.(비쥬얼 스튜디오의 경우 길이 15로 기억)위와 같은 상황..
-
bool은 왜 1비트가 아닌 1바이트인가프로그래밍/c++ 2018. 2. 9. 16:13
Because every C++ data Because every C++ data type must be addressable.https://stackoverflow.com/questions/2064550/c-why-bool-is-8-bits-long가장 심플하고 좋은 대답인 듯 ~~?? 하지만 bool 벡터(std::vector)의 경우는 비트로 특수화 되어있다.http://en.cppreference.com/w/cpp/container/vector_bool
-
c++에서 리플렉션 흉내내기프로그래밍/c++ 2018. 1. 3. 01:11
원시 타입을 구분할 enum을 만든다.enum class PrimitiveType{ Char = 1, String, Int16, Int32, Int64, Real32, Real64,}; 멤버 변수 하나를 표현하는 클래스를 만든다.class MemberVariable{public: MemberVariable(const char* name, PrimitiveType type, std::uint16_t offset) : name(name), type(type), offset(offset) { } const char* GetName() const { return name.c_str(); } PrimitiveType GetType() const { return type; } unsigned int GetOffse..
-
asio 기반으로 라이브러리 프로토타입을 만들었다.프로그래밍/c++ 2017. 12. 24. 15:10
실시간 게임에 필요한 기법들을 익혀보고자 개인 프로젝트를 진행하고 있는데, 거기서 쓸 용도의 서버 기반이 될 간단한 라이브러리의 프로토타입이 만들어졌다. 목적은 딱 tcp 기반의 i/o만 담당하는 서버.차기 c++ 표준 네트워크 라이브러리가 된다는 boost/asio를 사용했다.구동은 c++ 라이브러리와 새로운 구문 몇 개 써보고 싶은 게 있어서 visual studio 2017에서 테스트하며 제작했다.#include #include "Session.h" using namespace std; int main(){ nta::tcp::server_builder builder; builder .endpoint("localhost:16333") .max_sessions(2) .session([](nta::tcp..
-
비주얼 스튜디오, 64비트 테스트는 32비트 프로세스에서 실행할 수 없습니다. 오류 해결프로그래밍/의문 2017. 12. 12. 14:28
비주얼 스튜디오에서 기본적으로 제공하는 c++ 테스트 프로젝트를 써보려고 했다. 테스트 할 프로젝트를 참조하고, 프로젝트를 dll로 익스포팅 하고, 모두 다 했을 텐데 테스트를 실행하자 오류가 발생했다! 오류 메세지는 64비트 테스트는 32비트 프로세스에서 실행할 수 없습니다. 테스트 타겟 프로젝트도 64비트로 빌드했고, 유닛 테스트 프로젝트도 64비트로 설정했는데 무엇이 문제인가 찾아봄 요게 문제였다. 비주얼 스튜디오의 플랫폼이 x64로 되어있다고 해서 테스트도 그걸 따라가는 게 아니더라. 저 메세지가 발생한다면 테스트->테스트 설정->기본 프로세서 아키텍처를 한 번 확인해보자.테스트 설정의 기본 프로세서 아키텍처를 64비트로 설정하자 오류는 해결되었다.
-
트라이브스의 네트워킹 모델프로그래밍 2017. 12. 10. 20:35
트라이브스는 1998년에 출시된 FPS 장르의 게임이다.이 게임은 128명 까지 접속 가능한 게임 모드를 재공했으며 이는 당시 기술로는 어려운 일이었다.트라이브스를 만드는 데 사용된 네트워크 모델은 여전히 상당 부분 유용하다.효율성을 문제로 비 신뢰성 프로토콜, UDP를 사용했으며, 크게 네 가지 종류로 데이터 요구 사항을 구분했다. 전달 미보장 데이터: 게임에 있어서 중요하지 않은 데이터. 네트워크 대역폭이 적으면 이 종류의 데이터부터 생략한다.최신 상태 데이터: 지금이 아니면 의미 없는 성격의 데이터. // 현재 HP를 알고 있다면 5초 전의 HP는 중요하지 않다.전달 보장 데이터: 수신과 순서가 보장되어야 하는 데이터. // 플레이어의 총 발사 등특급 전달 보장 데이터: 최우선적으로 보내져야 하며 ..
-
유니티 클라이언트와 c++ 서버 플랫 버퍼로 통신하기 성공~프로그래밍/의문 2017. 12. 4. 22:10
c++ 서버는 boost/asio 기반으로 만들었다. #include #include #include #include "packets.h" class flatbuffers_filter : public nta::receive_filter // 아직 작성되지 않음{public: virtual result feed(const std::byte* data, std::size_t size) { return drain(size); }}; class session : public nta::tcp::session {public: session(nta::tcp::session_params params) : nta::tcp::session(std::move(params)) { } virtual void on_opened(..
-
c++17 std::transform과 구조화된 바인딩 예제프로그래밍/코드 조각 2017. 12. 4. 13:21
#include #include #include #include #include int main(){ std::vector a{ 1,2,3,4,5 }; std::vector b{ "6", "7", "8", "9", "10" }; std::vector c; std::transform(a.begin(), a.end(), b.begin(), std::back_inserter(c), [](auto a, auto b) { return std::make_tuple(a, b); }); for (auto v : c) { auto [x, y] = v; std::cout