728x90
반응형
- 배열의 각 요소에 특정 연산을 적용하는 것은 다양한 프로그램에서 흔히 필요합니다.
- 특히, 데이터 배열을 다룰 때 루프 내에서 수동으로 반복 처리하는 대신,
- 힙 배열(
heap array
) (동적 할당 배열) - 스택 배열(
stack sarray
) (정적 배열) - ... 에 모두 잘 동작하는 함수를 작성하면 코드의 재사용성과 가독성이 좋아집니다.
- 힙 배열(
- 하지만
C++
표준이 발전함에 따라 배열 크기 파악 및 함수 호출 방식에도 변화가 있었습니다. - 아래에서
C++17
이전과 이후의 차이점을 중심으로 설명드립니다.
C++17
이전에는 배열의 크기를sizeof
연산자로 직접 계산해야 했습니다.
-
cpp
void doubleInts(int* theArray, size_t size) { // 포인터 배열의 각 원소를 두 배로 만듭니다. for (size_t i = 0; i < size; i++) { theArray[i] *= 2; } }
-
배열 크기를
size_t
값으로 입력
-
cpp
void doubleIntsStack(int (&theArray)[4]) { // 크기가 고정된 배열을 두 배로 만듭니다. (현재 크기를 4로 고정) for (size_t i = 0; i < 4; i++) { theArray[i] *= 2; } }
⚠ 단점:
C++17
이전에는 인자의 배열 크기를 고정해야 해서 유연성이 떨어집니다.
-
cpp
int stackArray[] = { 5, 7, 9, 11 }; size_t arrSize = sizeof(stackArray) / sizeof(stackArray[0]);
-
cpp
#include <cstddef> void doubleInts(int* theArray, size_t size) { for (size_t i = 0; i < size; i++) { theArray[i] *= 2; } } void doubleIntsStack(int (&theArray)[4]) { for (size_t i = 0; i < 4; i++) { theArray[i] *= 2; } } int main() { size_t arrSize = 4; int* heapArray = new int[arrSize]{ 1, 5, 3, 4 }; doubleInts(heapArray, arrSize); delete[] heapArray; int stackArray[] = { 5, 7, 9, 11 }; arrSize = sizeof(stackArray) / sizeof(stackArray[0]); doubleInts(stackArray, arrSize); doubleIntsStack(stackArray); return 0; }
-
출처 :
Professional C++
C++17
부터는std::size()
함수를 사용하여 배열의 크기를 직관적으로 구할 수 있습니다.- 또한, 배열 참조 템플릿을 사용하면 더 유연하고 타입 안정적인 함수를 작성할 수 있습니다.
-
cpp
template<size_t N> void doubleIntsStack(int (&theArray)[N]) { // 배열 크기 N을 컴파일 타임에 자동 추론합니다. // 배열 크기를 인자로 입력받을 필요 없음. for (size_t i = 0; i < N; i++) { theArray[i] *= 2; } }
-
cpp
#include <array> // std::size() 포함 int stackArray[] = { 5, 7, 9, 11 }; size_t arrSize = std::size(stackArray); // 훨씬 간결하고 안전합니다.
-
cpp
#include <cstddef> #include <array> void doubleInts(int* theArray, size_t size) { for (size_t i = 0; i < size; i++) { theArray[i] *= 2; } } template<size_t N> void doubleIntsStack(int (&theArray)[N]) { for (size_t i = 0; i < N; i++) { theArray[i] *= 2; } } int main() { size_t arrSize = 4; int* heapArray = new int[arrSize]{ 1, 5, 3, 4 }; doubleInts(heapArray, arrSize); delete[] heapArray; int stackArray[] = { 5, 7, 9, 11 }; arrSize = std::size(stackArray); // C++17 이후 방식 doubleInts(stackArray, arrSize); doubleIntsStack(stackArray); // 템플릿으로 스택 배열 처리 가능 return 0; }
-
구분 C++98/03/11
C++17
배열 크기 계산 방법 sizeof(arr)/sizeof(arr[0])
std::size(arr)
스택 배열 함수 처리 고정 크기 참조 함수 필요 템플릿 함수로 유연한 크기 추론 가능 힙 배열 처리 int*
포인터 함수 필요동일하게 int*
포인터 함수 사용 -
C++17
이상 버전이 지원되는 환경에서 유연한 배열 크기 활용 가능합니다.
- 도움이 되셨으면 하단의 ❤️ 공감 버튼 부탁 드립니다. 감사합니다! 😄
728x90
반응형
'C C++' 카테고리의 다른 글
GCC 버전별 주요 C++20 기능 지원 현황 (0) | 2025.03.19 |
---|---|
C++ 표준 컨테이너 std::vector와 std::list의 차이점 비교 (0) | 2025.03.19 |
C++11 문자열 리터럴(Raw String Literal) (0) | 2025.03.18 |
C++ 중괄호 초기화(Uniform Initialization)와 프리미티브 타입의 기본값 정리 (0) | 2025.03.18 |
C++17 std::any_cast 사용법과 예제 (0) | 2025.03.18 |