728x90
반응형

C++ 배열(array) C++17 이전/이후 차이점

배열(array) 원소(element) 처리하기

  • 배열의 각 요소에 특정 연산을 적용하는 것은 다양한 프로그램에서 흔히 필요합니다.
  • 특히, 데이터 배열을 다룰 때 루프 내에서 수동으로 반복 처리하는 대신,
    • 힙 배열(heap array) (동적 할당 배열)
    • 스택 배열(stack sarray) (정적 배열)
    • ... 에 모두 잘 동작하는 함수를 작성하면 코드의 재사용성과 가독성이 좋아집니다.

  • 하지만 C++ 표준이 발전함에 따라 배열 크기 파악 및 함수 호출 방식에도 변화가 있었습니다.
  • 아래에서 C++17 이전과 이후의 차이점을 중심으로 설명드립니다.


C++98/03/11 : 배열 크기 추론과 함수 작성

  • 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 이전에는 인자의 배열 크기를 고정해야 해서 유연성이 떨어집니다.


배열 크기 계산 (C++17 이전)

  • cpp

      int stackArray[] = { 5, 7, 9, 11 };
      size_t arrSize = sizeof(stackArray) / sizeof(stackArray[0]);
    

C++17 이전 방식 예제

  • 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 : 배열 크기 추론과 템플릿 활용

  • C++17부터는 std::size() 함수를 사용하여 배열의 크기를 직관적으로 구할 수 있습니다.
  • 또한, 배열 참조 템플릿을 사용하면 더 유연하고 타입 안정적인 함수를 작성할 수 있습니다.

C++17 스택 배열 처리 템플릿 함수

  • cpp

      template<size_t N>
      void doubleIntsStack(int (&theArray)[N])
      {
          // 배열 크기 N을 컴파일 타임에 자동 추론합니다.
     	 // 배열 크기를 인자로 입력받을 필요 없음.
          for (size_t i = 0; i < N; i++) {
              theArray[i] *= 2;
          }
      }
    

배열 크기 계산 (C++17 이후)

  • cpp

      #include <array> // std::size() 포함
      int stackArray[] = { 5, 7, 9, 11 };
      size_t arrSize = std::size(stackArray); // 훨씬 간결하고 안전합니다.
    

C++17 이후 방식 예제

  • 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
반응형

+ Recent posts