본문 바로가기
C++

[C++] C 스타일 배열과 std::array

by imagineer_jinny 2022. 1. 20.

본 내용은 [C++] 어서와! 자료구조와 알고리즘은 처음이지? 프로그래밍 강의를 토대로 작성하였습니다.

 

  • 배열(array)이란?
    • 같은 종류의 데이터가 연속적으로 저장되어 있는 자료 구조

  • 메모리 주소는 시작 주소, 자료형의 크기, 인덱스 값을 조합해서 알아낼 수 있음

 

  • 배열의 특징
    • 인덱스(index)를 사용하여 원하는 원소(element)에 곧바로 접근 가능: O(1)
    • 캐시 지역성(cahce locality) : 배열의 각 원소는 서로 인접해 있기 때문에 하나의 원소에 접근할 때 그 근방에 있는 원소도 함께 캐시(cache)로 가져옴 
      • 캐시(cache)*: 컴퓨터 구조 관점에서 CPU에 가까이 있는 고속 메모리 버퍼
    • 반복문에서 배열을 사용하면 효율적인 프로그래밍이 가능
    • 상수 또는 상수표현식으로 크기를 지정(크기 불변)
    • 스택 메모리 영역에 할당 스택 메모리는 보통 1MB 할당
      • 따라서 너무 큰 크기의 배열 선언하면 스택 오버플로 에러 발생
#include <iostream>

using namespace std;


int main()
{
    //배열 만들 때 초기화 하지 않으면 
    //garbage value가 들어가게 됨
    //그래서 {}를 이용해서 초기화 해줌 (0으로 초기화)
    int scores[5] = {50,60,70,80,90};

    //배열의 크기
    //sizeof는 ()안 변수의 실제 메모리 크기 반환
    //int sz = sizeof(scores) / sizeof(int);  
    // ==  20/4 = 5 , == sizeof(scores) / sizeof(scores[0])
    
    //scores배열에 들어있는 element 크기를 반환
    int sz = std::size(scores);
   
    int s = 0;
    for (int i = 0; i < sz; i++)
    {
        s += scores[i];
    }

    float m = (float)s / sz;

    cout << "Mean score: " << m << endl;

    return 0;
}

 

  • C 스타일 배열
    • C 스타일 2차원 배열

  • std::array란?
    •  C++에서 C 스타일 배열을 대체하는 고정 크기 컨테이너 (C++11)
    • 원소의 타입과 배열 크기를 매개변수로 사용하는 클래스 템플릿
    • <array> 헤더 파일에 정의되어 있음
    • template<class T, std::size_t N>
      struct array; T: 데이터 타입, N: 원소의 갯수

  • std::array 특징
    • C 스타일 배열처럼 사용할 수 있는 [] 연산자 오버로딩*을 제공
    • 대입 연산자 지원 (깊은 복사*)
    • 배열의 크기를 정확하게 알 수 있음. array::size().
    • 반복자 지원
    • 예제코드

 

  • std::arrray 단점
    • 배열의 크기를 명시적으로 지정해야 함
    • 항상 스택 메모리*를 사용 (대용량 데이터를 저장하는 용도로 사용할 수 없음)
    • 고정 크기 배열이 아닌 가변 크기 배열을 더 선호함
    • 따라서 std::array 보단 std::vector가 많이 사용됨

 


캐시: 자주 사용하는 데이터나 값을 미리 복사해 놓는 임시 장소

[Server] Cache(캐시)란? - MangKyu's Diary (tistory.com)

 

[Server] Cache(캐시)란?

1. 캐시(Cache)란? [ Cache ] Cache란 자주 사용하는 데이터나 값을 미리 복사해 놓는 임시 장소를 가리킨다. 아래와 같은 저장공간 계층 구조에서 확인할 수 있듯이, 캐시는 저장 공간이 작고 비용이

mangkyu.tistory.com

 

연산자 오버로딩: C++ 에서 제공하는 기본 타입이 아닌 클래스 타입, 즉 사용자 정의 타입에도 연산자를 사용할 수 있게 하는 문법

[C++] 연산자 오버로딩(Overloading) (tistory.com)

 

[C++] 연산자 오버로딩(Overloading)

오버로딩이란? 오버로딩(Overloading)은 메서드의 이름은 하나만 주고 매개변수(parameter)를 다르게 함으로써 메서드를 여러개 만드는 것을 말합니다. 예를 들어볼까요? 정수와 실수에 대해서 덧셈을

ssungkang.tistory.com

 

깊은 복사: 

 

[C++] 얕은 복사(shallow copy) vs 깊은 복사(deep copy) :: Bright Dev Archive (tistory.com)

 

[C++] 얕은 복사(shallow copy) vs 깊은 복사(deep copy)

복사 생성 객체를 생성할 때, 기존에 있던 객체를 복사해서 생성하는 방법을 복사 생성이라고 합니다. class Person { int age; public: Person(int age) { this->age = age; } }; int main() { Person p1(20); //..

brightwon.tistory.com

 

스택 메모리:

프로그램이 자동으로 사용하는 임시 메모리 영역

함수 호출 시 생성되는 지역 변수 매개 변수가 저장되는 영역이고, 함수 호출이 완료되면 사라짐

메모리의 구조 (코드, 데이터, 힙, 스택 영역) (tistory.com)

 

메모리의 구조 (코드, 데이터, 힙, 스택 영역)

목차 메모리 코드(code) 영역 데이터(data) 영역 힙(heap) 영역 스택(stack) 영역 오버 플로우 메모리 위 그림과 같이, 프로그램이 실행되기 위해서는 운영체제(OS)가 프로그램의 정보를 메모리에 로드

all-young.tistory.com

 

'C++' 카테고리의 다른 글

[C++] 참조(Reference)  (0) 2022.01.22
[C++] Bool 데이터형  (0) 2022.01.21
[C++] 입력(Input)  (0) 2022.01.21
[C++] 출력(Output)  (0) 2022.01.04
Overriding, Virtual 함수  (0) 2021.09.14

댓글