최적화
-
반환값 최적화 RVO, NRVO프로그래밍/기록, 개념, 용어 2015. 3. 1. 18:50
클래스 내에서 어떤 객체를 반환하고 싶다. 하지만 반환되는 과정의 오버헤드가 두려울 수 있다. 1234std::string get_name() const{ return std::string(my_name);} 일단 저 구문을 보면 이렇게 될거라 생각할 수 있다. 3에서 임시 객체가 만들어지고, 그걸 반환하면서 복사 생성자가 또 호출될 것이다!과거에는 그랬다. 하지만 근래의 컴파일러는 다음처럼 내용을 바꿔버린다. 1234void get_name(std::string& dest) const{ new(&dest)std::string{my_name};} 이를 반환값 최적화(Return Value Optimization)라고 하며 이것에 의해 다음과 같은 구문들은 사실상 같은 것일 수도 있다. std::array..
-
포인터 에일리어스(Pointer Alias)프로그래밍/기록, 개념, 용어 2015. 2. 4. 21:20
포인터 에일리어스(Pointer Alias) 두 개 이상의 포인터 변수가 같은 메모리 위치를 담고 있을 때 그 포인터들을 에일리어스(alias)라고 부른다.컴파일러 입장에선 모든 포인터 변수가 서로의 에일리어스 일 수도 있다 생각하는 것이 안전하다. 포인터 에일리어스 발생 가능성이 높은 코드 void any_func( int* a, int* b ){ *b = *b + *a; *a = *a + 2; } 포인터 a, b가 에일리어스 상태가 아니라면 a의 값은 한 번만 로딩되면 된다. 에일리어스일 경우에는 포인터 b가 지칭하는 값에 대한 수정이 a가 지칭하는 값에 대한 수정일 수 있으므로 a의 값이 두 번 로딩되어야 한다. 포인터 에일리어싱이 가능한 코드 void func( int* a, int* b ) { ..