Lazy Initialization(초기화 지연)?

- 초기화를 바로 하는 것이 아닌 최초 필요한 시점에 초기화가 이루어지고,

이후에는 생성된 객체를 참조하게 되는 것

 

#1. Lazy Initialization은 필드 값을 사용하기 전까지는 계산하는 것을 원치 않고,

실제로 값을 사용하는 시점에서 계산하고자 할 때 유용 

 

#2. 객체 초기화는 첫 요청이 일어나느 시점에 이루어짐

 

#3. 싱글턴 패턴의 유형을 따르므로 멀티스레드 프로그램 작성시에는 동기화에 신경을 써야 한다.

그렇지 않으면 의도치 않은 결과를 가져 올 수 있다.

 

언제 사용하는 것이 좋은가?

- 정의된 필드가 많은 경우 사용되지 않는 상황이나,

초기화를 빨리 수행하고 부가 작업을 뒤로 미루고 싶을 때 적합하다.

 

언제 사용하지 않는 것이 좋은가?

- 최적화를 통해 성능 저하를 해결해야 하는 상황이 아니라면 초기화의 지연을 사용하지 않아야 한다.

  어떤 경우에는 초기화의 지연 기법이 디버깅을 어렵게 할 수 있다.

'Programming > C++ Modern' 카테고리의 다른 글

Precompiled Header  (0) 2019.09.05

싱글턴 패턴

- 오직 한 개의 클래스 인스턴스만을 갖도록 보장하고, 이에대한 전역적인 접근점을 제공

- 쉽게 구현이 가능해서 자주 사용되는 디자인 패턴 중 하나로 계속 생성하여도 실제로 생성되는 객체는 하나가 됨

- 최초 이후에 호출된 생성자는 최초의 객체를 리턴 하는 방식

- 공통적으로 쓰이는 자원을 관리, 저장하는 객체를 만들 때 자주 사용 됨

예를들어 게임에서 PlayerObject 같은 단일 객체 일 경우 싱글턴 패턴을 사용하면 관리가 편해짐

 

싱글턴 패턴의 문제점은?

- 싱글턴 인스턴스가 너무 많은 일을 해서 많은 데이터를 공유시킬 경우

  다른 클래스의 인스턴스들 간의 결합도가 높아진다.

- 멀티스레드 환경에서 동기화 처리를 해줘야 한다. 동기화 처리를 하지 않으면

  인스턴스가 두 개 생기는 경우가 발생 할 수도 있다.

 

가장 기본적인 방법의 싱글턴

private 생성자와 GetInstance라는 함수를 통해서 자신을 반환하는 클래스

위의 코드에 대한 문제점은 메모리 관련 문제가 발생 한다.

일단 static 멤버이기 때문에 Data영역에 할당되고 메모리를 계속 잡고 있고 여기서 더 큰 문제는

다른 전역 객체의 생성자에게 참조 할 경우 문제가 발생 할 수도 안할 수도 있다.

이런 현상이 발생하는 이유는 c++에서는 전역인 객체들 생성 순서가 명확히 정해져있지 않아서 그렇다.

그래서 객체의 생성 시점을 변경을 해야 한다.

 

늦은 초기화 개념을 도입한 싱글턴

 

이 객체는 GetInstance()를 호출을 하게 되는 시점에 생성이 된다.

Static Pointer형인 instance를 새로 생성했기 때문에 동적메모리 할당이 이루어지고,

해제는 어떻게 할 것인가 생각하게 된다.

이런식으로 사용을 하게되면 자원을 효율적인 메모리와 함께 관리를 하게 된다.

늦은 초기화 개념에 대해서는 Effective C++(책) 또는 검색을 통해 확인해볼 수 있다.

 

Precompiled Header(미리 컴파일된 헤더)?

- Visual Studio에서 새 프로젝트를 만들 때 .pch.h라는 미리 컴파일된 헤더 파일이 프로젝트에 추가 된다.

(2017 버전 이하 버전에서는 파일을 stdafx.h라고 한다)

 

2017이상 버전

 

이 파일의 목적은 빌드 프로세스의 속도를 높이는 것다.

 

C / C++ 언어에서 헤더 파일은 C 전처리기에 의해 자동적으로 소스 코드를 포함하게 된다.

그런데 일부 헤더 파일의 경우 방대한 크기의 소스 코드를 포함 할 수 있고,

이런 코드들을 매번 컴파일하면 컴파일 시간이 매우 길어지게 된다.

그래서 자주 바뀌지 않는 기본적인 라이브러리들의 경우에 컴파일 시간을 줄이고자

컴파일러가 사전에 헤더 파일들을 미리 컴파일 해 놓고 쓸 수 있게 한다.

 

Precompiled Header를 사용할 경우 Precompiled Header로 지정한 헤더 파일 및 소스 코드는

컴파일시에 컴파일 되지 않고 pch의 결과물을 가져다 사용하게 되는 것이다.

 

프로젝트 속성 > C / C++ > 미리 컴파일된 헤더 항목에서 사용 여부를 선택할 수 있다.

빈프로젝트에서는 이것이 사용 안함으로 체크 되어 있는데, 이 경우 매번 전체 헤더파일을 재빌드 하게 되므로

사용 안함으로 체크되어 있다면 아래와 같이 만들기를 선택해서 pch를 만들어 주고

Precompiled Header 사용하기를 선택하면 사용 할 수 있게 된다.

pch는 한 번 미리 빌드를 해 놓고 그 다음부터는 재빌드를 하지 않은 상태로 사용하는 모듈들이 되야 하므로,

pch에는 프로젝트 진행 중에 값이 거의 바뀌지 않는 외부 라이브러리나 전역 변수 등의 내용을 포함시키면 된다.

이렇게 하면 매번 재빌드 하지 않고 컴파일 시간을 많이 줄일 수 있다.

 

주의점

미리 컴파일된 헤더에 포함된 파일이 수정이 일어나면 미리 컴파일된 헤더도 새로 만들게 된다.

이렇게 되면 미리 컴파일된 헤더를 사용하는 의미가 없어지게 된다.

그래서 어떤 헤더 파일을 미리 컴파일 시켜야 해야 할까?...

MSDN을 보면 다음 사항에 미리 컴파일된 헤더 파일 사용을 권장하고 있다.

 

■ 자주 바뀌지 않고 크기가 큰 코드 본문을 항상 사용

 프로그램이 여러개의 모듈로 구성되어 있으며,

모든 모듈이 포함 파일의 표준 집합 및 동일한 컴파일 옵션을 사용

이 경우 모든 포함 파일을 미리 컴파일해서 하나의 미리 컴파일된 헤더로 만들 수 있다.

'Programming > C++ Modern' 카테고리의 다른 글

Lazy Initialization  (0) 2019.09.09

+ Recent posts