본문 바로가기

개발 관련 기타/C++

(14)
C++) 함수를 static으로 선언 declare 한다는 것 멤버 함수를 static으로 호출 한다는 것 class instance를 만들지 않고 함수를 호출하겠다는 것 class의 static 멤버 변수만 가지고 놀려는 것 그 반면 일반 함수를 static으로 호출 한다는 것 static int getInt(int i) // 이 둘의 차이는 int getInt(int i) global 함수와는 다르게 static local 함수가 됨 이 말이란 같은 파일 내의 함수들 내에서만 static 함수를 호출 할 수 있음
C++) check whether file exists 파일 존재 여부 확인 [access(2)] 파일 존재 여부 확인 시 자주 사용하는 함수는 access 라는 함수 입니다. 함수의 정의 int access(const char* pathname, int mode) mode에는 파일의 어떤 부분을 확인 할지 전달 F_OK (파일 존재 여부) R_OK (파일 읽기 권한 여부) W_OK (파일 쓰기 권한 여부) X_OK (파일 실행 권한 여부) 함수의 반환 값 성공 시 zero 반환 실패 시 -1 반환 (errno is set) set 되는 errno 리스트 EACCES (권한 부족) ELOOP 등 사용 예제 확인 할 파일 경로 (const char *) : "/tmp/file" 확인 할 파일 부분 (int) : F_OK #include const char* file_path = "/tmp/file"; ..
C++) static 멤버 변수 life cycle class encapsulation과 관계가 있다 static 멤버 변수는 외부에서 global하게 initialize 되어야 한다. static 멤버 변수는 class 내부에서 private 하게 선언되어 있어야 효과가 있다 외부 사람들은 쓰려면 클래스에서 정의된 getter 함수를 사용하여야 한다.
C++) [스마트 포인터] weak_pointer, unique_pointer, shared_pointer unique_ponter는 이름이 말하듯이 unique 하게 한 곳에서만 해당 객체를 사용할 때 다른 곳에서는 쉽게 사용하지 못하도록 막는 smart pointer 이다. shared_pointer는 약점이 있다. A -> B를 참조하고 B -> A를 참조 할 때 메모리를 해제 할 수 없다. Scope에서 벗어나 A를 해제 하였을 때 B -> A를 참조해서 삭제 안됨. Scope에서 벗어나 B를 해제 하였을 때 A -> B를 참조해서 삭제 안됨. weak_pointer를 사용해서 위 문제를 해결 할 수 있다. B -> A shared_pointer를 이용하는 weak_pointer로 만들면 참조는 가능하지만 ref count를 증가시키지 않는다 weak_pointer는 ref count를 증가시키지 않는..
C++) Reader-Writer 문제로 본 mutex와 condition variable Mutex lock 함수로 임계 구역 (critical section) 진입 전 자신만 임계 구역에 들어가겠다고 함 unlock 함수로 임계 구역 탈출 후 다른 사람들도 임계 구역에 진입 가능하도록 만듬 Condition Variable wait 시 인자로 받은 mutex를 unlock 함 notify_one 함수로 잠자는 것들 중 하나를 깨울 수 있음 notify_all 함수로 잠자는 것들 모두를 깨울 수 있음 Reader-Writer 문제에서 mutex와 condition variable을 사용한다면 std::mutex mtx; std::condition_variable cv; int num_writers_waiting; bool writer_active; int num_readers_active; ..
C++) std::bind 와 std::placeholders (std::placeholders::_1, std::placeholders::_2, ...) std::bind std::bind를 알려면 std::function을 알아야 해요 std::function C+11에서 나온 함수 포인터로 사용 할 수 있는 std::function std::function name = &함수 이런 식으로 선언을 해요 예) std::function myFunc = &calculate; 이때 calculate는 이미 bool calculate(int, int) 라는 형식을 갖고 선언이 되있어요. 그러면 다시 std::bind를 볼께요 std::bind std::bind는 반환값이 std::function 인데요 특정 인자를 갖거나 특정 객체의 함수를 부르도록 구체적인 std::function을 제공해요 위의 예) std::function myFunc = &calculat..
C++) RAII 디자인 패턴 RAII: Resource Acquisition Is Initialization. 리소스를 초기화 할 때 메모리 할당까지 이루어지는 방식이다. RAII를 기반으로 만들어진게 shared_ptr, unique_ptr이 있다. string을 예로 들어 설명 하겠다. class String { public: String() { new char[256]; } ~String() { delete[] char; } } 위 클래스 String은 RAII를 따르도록 구현되었다. String의 생성자에서 메모리를 할당하고, String의 소멸자에서 메모리를 제거한다. 이렇게 하므로서 얻는 장점은 다음과 같다. int main() { char* str = new char[256]; ... // 함수 실행 도중 error 발..
(C언어) epoll 정의 epoll 리눅스에서 select 대신 사용 가능한 I/O subscription 모델 FD를 등록하여 해당 FD를 계속 확인하거나 일정 시간 확인하여 요청된 이벤트를 처리하는 메케니즘 int epoll_create(int size); fd들의 입출력 이벤트 저장을 위한 공간 할당 int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event) op 값으로 EPOLL_CTL_ADD, EPOLL_CTL_MOD, EPOLL_CTL_DEL 이 들어 올 수 있음 EPOLL_CTL_ADD: epoll에 fd를 등록 (fd로 처리 할 이벤트 종류 등록) [종류: EPOLLIN, EPOLLOUT, EPOLLPRI 등] int epoll_wait(int epfd,..