프로그래밍
-
32비트 OS(운영체제)에서 64비트 OS로 바꾸면 성능이 꼭 향상만 될까?프로그래밍/의문 2015. 2. 4. 18:08
꼭 그렇지는 않다. 64비트의 넓은 주소 공간은 성능을 떨어뜨리는 요인이다. 포인터가 4바이트에서 8바이트로 커지고, 일부 변수는 크기가 커지기도 한다. 변수의 크기가 늘어났다는 것은 메모리 소요량이 커졌다는 것과 같아서 캐시, 레지스터의 공간을 더 빠르게 소모하게 되므로 이런 부분에서 성능 저하가 일어난다. struct s{ int* ptr[8];}; 구조체 pod가 32비트로 컴파일이 된다면 4(size of 32bit ptr)*8 의 사이즈로 총 32바이트를 차지하므로 64바이트 캐시라인 하나에 구조체가 두 개 들어갈 수 있지만, 64비트로 컴파일이 되면 크기가 2배로 되고 캐시라인에 하나의 구조체밖에 들어가질 못한다. 따라서 이러한 메모리 점유율 증가는 오히려 프로그램의 구동 성능을 떨어뜨릴 수 ..
-
C++ 오브젝트 생성시 {}와 () =의 구분프로그래밍/c++ 2015. 2. 2. 00:07
C++11에서의 초기화 방법들은 다음과 같은것이 있다. int a = 0;int a(0);int a{0}; 여기에서 int a = { 0 } 이와 같은 문법은 {}만 같이 쓴거처럼 처리된다. 즉, int a = {0} == int a{0} {}는 C++11부터의 초기화 문법으로, {}를 사용하는 초기화를 유니폼 초기화(uniform initialization)라고 한다. * 모든 non static value의 초기화는 {}를 이용해서 가능하다 class widget{ int a(0); // error int b{0}; // ok int c = 0; // ok }; * 복사가 안 되는 오브젝트에 대해서는 ()는 되지만 =는 안 된다. std::atomic a{0}; // okstd::atomic b(0)..
-
스핀락(Spinlock)프로그래밍/기록, 개념, 용어 2015. 1. 23. 14:15
스핀락(Spinlock) 스핀락(spinlock)은 바쁜 대기의 개념을 이용한 락으로, 임계 구역(critical section)에 진입이 불가능할 때 진입이 가능할 때까지 루프를 돌면서 재시도하는 방식으로 구현된 락을 가리킨다. 스핀락이라는 이름의 유래는 락을 획득할 때까지 해당 스레드가 빙빙 돌고 있다(spinning)는 것을 의미한다. 뮤텍스 락과의 차이점은 락을 얻을 수 없을때 스레드 슬립 모드로 빠지지 않고, 반복문을 계속 돌며 락을 얻으려는 시도를 한다는 것으로,락이 해제될 때 별도의 스레드 문맥교환(context switching)에 대한 오버헤드 없이 임계구역에 접근을 한다는 점이다. 뮤텍스 락의 경우, 락이 해제되더라도 운영체제에 의해 스레드가 다시 깨어나야하지만, 스핀락은 락을 얻을때까..
-
session의 send부분에 대한 고찰프로그래밍 2014. 11. 23. 22:01
push_data 부분을 size만큼 메모리를 할당하고 데이터 복사를 하는 방식으로 구현한다면 여러 thread에서 send를 호출하더라도 queue에 순차적인 데이터 push가 보장된다. push_data(data, size){ memory = new byte[size] // size만큼 메모리 할당 copy(data, memory) // 데이터 복사 send_queue.push(memory) // queue에 메모리를 push } 반면, push_data를 재귀하며 데이터를 고정된 버퍼에 담는 방식을 취한다면 순서가 섞일 수 있다. push_data(data, size){ byte buf[128] copy(data, buf) send_queue.push(buf) ... push_data(end, re..
-
[c++] c++11에 추가된 표준 뮤텍스(mutex)프로그래밍 2014. 7. 14. 01:45
c++11에 추가된 mutex는 객체간 동기화를 돕는 라이브러리이다. mutex는 윈도우 환경에선 내부적으로 크리티컬 섹션(CriticalSection)을 이용한다. 헤더: mutex네임스페이스: std 1. mutex 가장 일반적인 mutex. lock, unlock, try_lock의 멤버 함수를 가진다. 2. recursive_mutex 중첩 lock을 허용하는 mutex. 단, lock을 한 만큼 unlock을 해줘야한다. 다음 상황은 lock이 된 상태에서 또 lock을 했다. 일반적인 뮤텍스라면 데드락 상태에 빠지겠지만 recursive_mutex은 중첩 lock을 허용한다. class memstream{ public: bool allocated() const { mutex.lock(); //..
-
C++11 가변 인자 템플릿의 사용 예프로그래밍/c++ 2014. 6. 29. 14:05
기존 C++에서는 여러개의 인자를 받는 템플릿 함수를 만들때123456789101112131415161718192021222324 void create() { instance = new Type{}; } template void create(T0 arg0) { instance = new Type{ arg0 }; } template void create(T0 arg0, T1 arg1) { instance = new Type{ arg0, arg1 }; } template void create(T0 arg0, T1 arg1, T2 arg2) { instance = new Type{ arg0, arg1, arg2 }; } .. 이런식으로 만드는 경우가 있었다.저런 코드를 C++11부터 추가된 기능인 가변 인자 ..