Computing

[문법] Range-based for loop 본문

Programming/C++

[문법] Range-based for loop

jhson989 2023. 7. 21. 23:13

Range-based for loop는 C++11부터 추가된 for syntax로 다음과 같은 구조를 가진다.

 

/*
for (for-range-declaration: range) {
    statement
}
*/

int A[3] = {1, 2, 3};
for (auto& a : A) {
	std::cout << a << std::endl;
}

 

range는 반복될 수 있는 객체를 의미하는데, 예를 들면, statically allocated array나 std::vector, std::list 등의 STL sequence container가 될 수 있다.

 

중요한 것은 컴파일러가 그 크기를 알 수 있는 객체여야 한다는 점이다. statically allocated array는 그 크기가 정해져 있기에 어디서 어디까지 for문을 실행해야 하는 지 컴파일러가 알아낼 수 있다. 혹은 begin(), end() 맴버 함수가 포함된 객체도 가능하다. STL sequence container (std::vector, std::list, etc.) 의 경우, 모두 begin(), end() 함수를 제공하기에 Range-based for loop가 지원된다.

 

그에 비해 dynamically allocated array의 경우 컴파일러가 그 크기를 도출할 수 없기에 Range-based for loop를 사용할 수 없다. 컴파일러가 Range-based for loop syntax를 처리 하기 때문에 이런 한계가 있다. 예를 들어 밑의 코드를 보자.

 

...
int N = read_number_from_file() // 파일로 부터 데이터 읽어오는 함수
int* A = new int[N];

// error: A의 크기를 알 수 없음
for (auto& a : A) {
	std::cout << a << std::endl;
}

 

컴파일러는 begin(), end()함수가 정의되어 있던 지, 혹은 배열의 크기가 정해진 경우 Range-based for loop를 처리할 수 있는데, 위의 배열의 크기는 컴파일러가 알 수 없기에 처리하지 못한다[2]. 

 

Range-based for loop의 사용할 경우의 장점은 사실 코드가 읽기 혹은 작성하기 쉽게 간결해지는 것밖에 없다. 성능상의 이점은 없다. (컴파일러가 처리하는 syntactic sugar이기 때문에 당연한 말 아닐까 싶다)

 

 

 

Reference

[1] Range-based for loop (since C++11) - cppreference.com

[2] Why doesn't C++ support range based for loop for dynamic arrays? - Stack Overflow