메모리

C++

[C++] STL - vector

vector 라이브러리 선행 * vector 라이브러리는 STL 중에 하나이다. [C++] STL - Standard Template Library STL - Standard Template Library STL * C++에서 제공하는 표준 라이브러리이다. * STL을 사용해 기본적인 자료구조를 구현, 사용할 수 있다. (리스트, 큐, 스택, 맵, 셋, 등등...) * 이러한 저장 공간을 Container라 licktwice.tistory.com * vector는 동적 배열이다. [자료구조] 동적 배열 특징 동적 배열 특징 배열의 특징 * 배열이라고 하면 기본적으로 생각하는 특징들이 있다. * 인덱스를 사용해 요소에 접근한다. * 메모리는 빈틈없이 이어져 있는 하나의 덩어리다. * 데이터의 순서를 lic..

자료구조

[자료구조] 동적 배열 특징

동적 배열 특징 배열의 특징 * 배열이라고 하면 기본적으로 생각하는 특징들이 있다. * 인덱스를 사용해 요소에 접근한다. * 메모리는 빈틈없이 이어져 있는 하나의 덩어리다. * 데이터의 순서를 중요하게 생각하기 때문에 중간 삽입이나 삭제 시 비용이 크다. (순서유지를 위해 한 칸씩 밀어야 하기 때문에) * 유효한 데이터 사이에 쓰레기 값은 없다. (배열[10]일때 데이터를 5개 넣는다면 0~4까지 넣는다. ) (1, 3, 6, 7, 8처럼 제멋대로 넣지 않는다.) 동적 배열 * 동적 배열은 너무나 자주 사용하기 때문에 대부분의 언어에서 공식 라이브러리로 지원한다. * 위에 특징은 유지하며, 힙 메모리에 만들면 그게 동적 배열이다. 동적 배열 특징 * 힙 메모리에 할당하는 게 특징이다. * 운영체제를 거치..

자바 JAVA

[JAVA]자바 - 상속과 컴포지션

상속과 컴포지션 상속과 컴포지션, 재사용성 * 상속과 컴포지션은 재사용성을 위해 사용된다. * 둘 중 어떤 걸 사용해도 구현은 가능하다. (대부분) 특수한 상황에서 차이점이 나타나기도 한다. (성능, 관리 등등) * 특별한 상황이 아니라면, 사람이 생각하는 것처럼 만드는게 좋다. 사람이 생각하기 편하게 설계하는 것이 가독성도 높고, 이해가 편하기 때문이다. 성능 * 성능은 상속이 더 좋다. * 상속은 객체 생성 시 메모리가 하나의 덩어리로 만들어진다. 컴포지션은 각각 메모리가 생성되고 분산되어 있다. * 컴포지션의 분산된 메모리는 실행 성능의 큰 영향을 미친다. (CPU 캐시메모리 메모리) 형태로 데이터가 전송되는데, 캐시메모리는 사용할 메모리의 주변 메모리까지 한꺼번에 가져온다. * 즉, 현재 사용한 ..

C

라이브러리

라이브러리 라이브러리란? * 라이브러리는 다른 파일들과 합쳐지기 위한 파일이다. (허접한 설명이네) * 다른 파일과 합쳐지는 게 목적이므로 프로젝트이지만 실행파일을 만들지 않는다. * 코드 재사용이 매우 높다. * C에서 라이브러리는 정적 라이브러리와 동적 라이브러리로 나눌 수 있다. * 대표적으로 c표준라이브러리에 들어있는 함수들을 우리는 자유롭게 사용한다. 코드가 내부적으로 어떻게 도는지 정확히 알 수는 없지만 우리는 라이브러리를 믿고 함수를 사용한다. * 소스코드를 보여줄 수도 있지만, 라이브러리는 오브젝트파일만 보내도 괜찮다. 헤더파일과 함수에 대한 설명만 충분하다면 우리는 기술 유출을 방지하며 라이브러리를 배포할 수 있다. 라이브러리는 프로젝트이다 * 일단 프로젝트(project)란 실행파일이나..

C

restrict 키워드

restrict 키워드 restrict란? * 포인터 변수에 사용 가능한 키워드이다. * restrict는 특정 메모리를 사용하는 포인터가 단 하나임을 뜻한다. 하지만 컴파일러가 이를 무시할 수도 있다. 즉, restrict를 붙인 포인터 변수는 그 메모리를 가리키는 유일한 포인터이다. 유일함에서 오는 장점 * 컴파일러는 코드를 방어적으로 구현하는데 많은 노력을 기울인다. 방어적 구현 중에는 포인터가 가리키는 메모리가 중첩되어 데이터 손실이나 오류가 일어나는 것을 막는 것이 있다. * 함수 안에서 같은 변수를 3번 사용한다면? => 메모리가 겹쳐서 값이 변할 수 있으므로, 컴파일러는 3번 변수를 사용할 때 3번 변수를 호출한다. * 함수 안에서 restrict가 붙은 변수를 3번 사용한다면? => 1번만..

C

전역변수

전역변수 전역변수의 특징 * 전역변수를 사용하는 가장 큰 이유는 접근성과 생명주기이다. * 전역변수는 메모리에서 데이터(data) 섹션에 들어가 있다. 정적 변수 또한 같다. * 전역변수는 프로그램이 시작될 때 생성되고, 프로그램이 종료될 때 삭제된다. * 값을 넣지 않으면 0으로 초기화된다. 분할 컴파일 and 전역변수의 단점 * 파일이 여러 개일 때 컴파일러는 각각의 파일을 따로 컴파일해서 오브젝트 파일로 만들고, 나중에 링킹 과정을 거쳐 하나의 실행파일로 만든다. * 전역변수는 데이터 영역에 들어가 있으며 다른 파일에서도 사용할 수 있다. 다른 파일에서도 사용할 수 있다는 점은 장점이지만, 다른 사용자가 사용하는 것을 막지 못한다는 점은 큰 단점이다. 누구나 사용하는 전역변수 * 프로그래머가 전역변..

C

동적 메모리 할당에 관한 규칙, 권장

동적 메모리 할당, 해제에 관한 규칙 또는 권장 (이 글은 편협한 지식을 가지고 쓰는 의견일 뿐입니다...) 어째서 규칙을 만들어야 하는가? * 메모리를 할당했으면 무조건 해제해야 하며, 중복 해제 또한 매우 위험하기 때문이다. * 따라서 누가(언제, 어디서) 책임을 지고 해제를 수행해야 하는가에 대한 명확한 규칙이 있어야 한다고 생각한다. (이는 자기 자신과 팀원 모두에게 이롭다고 생각한다.) 1. 메모리를 생성한 함수가 책임지고 해제한다. * 가장 먼저 생각해봐야 하는 구조이다. 이 구조로 만들 수 있다면 가장 올바른 방법이라 생각한다. 1-1. 함수 안에 return이 많다면 #include #include void make_int_malloc(size_t size) { int* p = malloc..

C

free 함수

void free(void* p); 매개변수(인자) void* p = 할당받은 주소 (이상한 값을 넣었을 때의 결과가 정의되지 않음) 반환값(리턴값) * 없엉 설명 * 이상한 값을 넣어면 = 위험함 * 이미 해제된 주소을 넣으면 = 위험함 * NULL을 넣으면 = ㄱㅊ 그냥 넘어감 *안전한 코딩을 위해 free 이후 포인터를 초기화해준다. free 함수는 어떻게 메모리의 크기를 알고 해제할까? * 매개변수에 주소값들어가는데 메모리의 크기를 어떻게 알고 알맞은 크기를 해제하는 것일까? 주의! 이 설명은 구현마다 다를 수 있습니다! * 할당 함수는 사실 원하는 size보다 더 큰 크기를 잡는다. 더 큰 크기는 무엇을 위해 잡는가? -> 할당한 메모리의 정보를 저장하기 위해(예= 크기) 정보 반환되는 주소 ...

C

realloc 함수와 memcpy 함수

void* memcpy(void* dest, const void* src, size_t count); 매개변수(인자) void* dest = 복사 데이터를 받을 주소 const void* src = 원본 주소 size_t count = 복사할 데이터의 크기 (바이트) 반환값(리턴값) void* = dest가 반환된다. 설명 * src를 시작점으로 count 바이트만큼 복사해서 dest에 집어넣는다. * 바이너리(이진법) 형태로 복사하기 때문에 널문자로 같이 복사될 뿐이다. * 무식하게 복사하기 때문에 양쪽에 자료형이 뭔지 상관없다. 그냥 복사한다. * 오버플로우가 일어날 수 있다. * #include 를 해야 한다. 예제 #define _CRT_SECURE_NO_WARNINGS #include #incl..

C

malloc 함수, calloc 함수

void* malloc(size_t size); 매개변수(인자) size_t size = size 바이트만큼 메모리를 할당받는다. 반환값(리턴값) * 주소를 반환한다. (void*) 실패 시 NULL 설명 * 스택 메모리를 사용하기 위한 함수. * malloc은 memory allocation이라는 뜻이다. * #include 가 있어야 한다. * 할당/해제를 수동으로 해야 하며 힙보다 느리다. * 할당받은 메모리에는 쓰레기 값이 들어있다. 할당을 실패했다면? * 함수가 실패했다면 NULL을 반환하니 실패 여부는 쉽게 알 수 있다. 하지만 malloc 같은 동적 메모리 할당 함수의 실패는 우리가 해결할 수 없는 경우가 많다. * 메모리 공간이 부족해서 함수가 NULL을 반환했다면 우리가 뭘 어쩌겠는가? ..

스누징어
'메모리' 태그의 글 목록