일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- kubernetes
- sycl
- Compression
- deep_learning
- Semiconductor
- stl
- 쿠버네티스
- 클라우드
- 딥러닝
- POD
- DRAM
- flash_memory
- SpMM
- CuDNN
- jhDNN
- cloud
- 반도체기초
- Qubit
- dnn
- HA
- convolution
- C++
- nvidia
- GPU
- 반도체
- quantum_computing
- CUDA
- FPGA
- 양자역학의공준
- jhVM
- Today
- Total
Computing
[문법] Range-based for loop 본문
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
'Programming > C++' 카테고리의 다른 글
스마트 포인터 정리 (Smart Pointer, unique_ptr, shared_ptr) (0) | 2023.08.19 |
---|---|
RAII 개념과 필요성 (0) | 2023.08.03 |
[STL] [3] 컨테이너 어댑터 정리 (Container Adapter, std::stack, std::queue, std::priority_queue (0) | 2023.08.01 |
[STL] [2] 연관 컨테이너 정리 (Associative Container, std::set, std::map) (0) | 2023.07.23 |
[STL] [1] 순차 컨테이너 정리 (Sequence Container, std::array, std::vector, std::list, std::deque) (0) | 2023.07.18 |