Cache는 메인 메모리인 RAM과 CPU 사이에 위치한 고속 메모리 입니다. CPU 는 명령어와 데이터를 Cache에서 먼저 찾고 없으면 RAM에 접근합니다. CPU는 RAM보다 훨씬 접근이 빠르기에 가능한 많은 데이터를 Cache에 저장하는것이 좋습니다. 1. 연속된 메모리 공간 사용하기- 연속된 메모리 공간을 사용하면 캐시 히트 확률이 올라갑니다. 연속 메모리 공간을 사용하는 vector가 list 보다 캐시 히트 확률이 높습니다. 2. 지역성- 시간 지역성 : 최근에 접근한 데이터 반복 접근ex) for문을 사용할때 같은 메모리 참조 - 공간 지역성 : 인접한 메모리 접근 확률 높을때ex) 벡터의 연속된 메모리 공간 3. 열보단 행에 우선 접근하기- 행은 연속적 메모리 공간임으로, 캐시 히트..
스택 오버플로우란- 스택 오버플로우란 스택 메모리 영역이 초과되는 현상을 의미합니다. 스택은 OS마다 고정된 크기의 메모리가 할당됩니다. 할당된 메모리 보다 큰 메모리가 들어오면 스택영역에서 오버플로우가 발생하게 됩니다. 스택 오버플로우의 원인 1. 재귀함수가 너무 많이 호출될때- 재귀함수를 너무 많이 호출하거나, 탈출 조건을 명시하지 않으면 스택 오버플로우가 발생합니다. 2. 지역변수가 클때- int k[백만]인 지역변수가 있고 할당된 크기가 1MB면, 4MB의 메모리 공간이 필요함으로 오버플로우가 발생하게 됩니다. 3. 여러 함수를 순차적으로 실행하며 함수 호출이 깊어질때 스택 오버플로우의 증상 1. 프로그램 크래쉬 - 프로그램이 갑자기 종료됩니다. 2. Segmentation Fault - 잘..
다양한 언어에서의 인터페이스 개념은 다형성을 제공하기 위한 부모 클래스를 인터페이스라고 부릅니다. C++에서는 순수 가상 함수로만 이루어진 부모 클래스를 인터페이스라고 부르고, 이 인터페이스는 인스턴스화 즉 객체를 만들지 못합니다.
RTTI란- RunTime type Information(런타임 타입 정보)의 약자로 런타임 시점에서 객체의 실제 타입 정보를 제공하는 기능 입니다.대표적인 기능으로는 Rtti메모리 공간 안의 type_info를 이용해서 typeid와 dynamic_cast를 사용할 수 있습니다. RTTI 생성 시점- RTTI는 컴파일 타임에서 생성되며, 프로그램 정적 데이터 영역에 위치합니다. vtable이 생성되면 테이블에 RTTI 블록이 연결됩니다. vtable가 생성될 때, 첫번째 위치에 RTTI 블록 포인터를 위치 시킵니다. vtable의 구조 (단순화된 형태)vtable (Base의 vtable)+-------------------+ | RTTI 블록의 포인터 | -- RTTI 블록에 대한 포인터 +-----..
vtable (링킹 단계에서 vtable과 rtti 블록이 데이터 세그먼트에 추가)- vtable은 클래스당 하나씩 존재합니다. - 클래스의 모든 가상 함수 주소가 vtable에 저장됩니다. vptr (초기화는 생성함수가 실행될 때, 생성함수 내부에서 vptr를 해당 vtable 주소값으로 초기화)- 객체마다 생성될때 vptr가 설정 되며, 해당 vptr은 vtable을 가킵니다. - 크기는 포인터 크기와 같습니다. (64비트 프로그램에선 8바이트) 메모리 레이아웃이란 : 객체 내부의 메모리 구조입니다. 어떤 변수(vptr, 객체 내부 멤버 변수)들이 어떤 순서로 배치 되었는지를 나타내는 것 입니다.
1. 람다 식에서 캡쳐를 사용할때, this를 캡쳐하는것이 아닌 필요한 변수들만 캡쳐하기. 2. 구조체를 생성할때 메모리 작은 순으로 정렬하여 구조체 패딩 줄이기 ex)struct k{ char k; // 1바이트 int k; // 4바이트로 8바이트를 만들기 위해 3바이트 패딩 발생 char k; // 1바이트}=> struct k{ char k; // 1바이트 char k; // 1바이트 int k; // 4바이트로 작은 순서대로 정렬} 3. 가상 함수 사용 줄이기- 가상 테이블이 선언 되면 vtable 8바이트의 메모리 공간이 사용됩니다. 4. 동적 할당 메모리 사용 줄이기- new로 동적 할당 되면, 추가 관리 정보를 위해 16바이트 이상의 메모리..
std::function : c++ 표준 라이브러리에서 사용하는 함수를 감싸주는 wrapper 객체이며, 어떤 형태의 함수든 담을 수 있는 가변형 함수 포인터 입니다. std::function 함수는 작은 람다식이나 작은 캡쳐가 들어오면 sbo(small buffer optimize)라는 작은 메모리 공간을 사용하지만, 큰 람다식이나 this 같은 객체 캡쳐가 들어오면 가상 메모리 테이블인 vtabel을 사용합니다. vtabel 사용이유 : function에는 다양한 함수, 람다식, 멤버 함수 등을 하나의 인터페이스로 제공 해야합니다. 각기 다른 형태를 하나의 인터페이스로 제공하기 위해서는 다형성 사용이 필수적이며 동적바인딩인 런타임에서 함수가 결정되기에 vtable과 vptr을 이용합니다. vtable..
공통점 데이터 영역과 BSS영역 모두 전역변수와 스테틱 변수를 저장합니다. 차이점1. 메모리가 저장되는 위치 : 가상 메모리에 저장되는 위치가 다릅니다. BSS영역은 힙 영역 위 데이터 영역 밑, 데이터 영역은 BSS영역 위에 위치합니다. 2. 변수 초기화 : BSS영역은 전역변수와 static변수에 값이 안들어오면 0으로 자동 초기화 해두고 메모리에 올리지 않아서 실행 파일 크기를 줄일 수 있습니다. 데이터 영역은 명시적으로 입력된 값으로 초기화 하고 메모리에 올려둡니다.
연산자 오버로딩 조건1. Public + Static 이어야 합니다. 2. 모든 리턴 타입이 가능하나, void 타입은 불가능 합니다. public class Num{ private int m_num; public Num(int num = 0) { this.m_num = nums; } public static int operator +(Num n1, Num n2) { return n1.m_num + n2.m_num; }}class Sum{ static void Main() { Num num1 = new Num(1); Num num2 = new Num(2); int result = num1 + num2; // + 연산자..
- 그냥 함수는 호출 시점마다 함수 호출 과정을 거칩니다. 함수가 많이 호출되면 그만큼 속도도 현저하게 느려지는 오버헤드 현상이 발생합니다. - 위의 단점을 보안하기 위해 나온것이 inline함수입니다. inline 함수는 컴파일 단계에서 처리가 진행 됨으로, 해당 inline 함수를 호출하는것은 미리 바로 리턴값이 호출되게 변환시켜둡니다. 장점 :함수 호출 오버헤드가 발생하지 않습니다. 단점 :1. 실행 코드가 길어집니다.2. 구현이 길어지면 컴파일러가 일반 함수로 취급합니다.3. 인라인 함수를 자주 사용하면 같은 코드 중복으로 바이너리 실행 파일이 커집니다.4. 인라인 함수가 변경되면 전체 코드가 변경사항을 반영해야함으로, 컴파일 시간 오버헤드가 발생합니다. 결론 : 그냥 함수들은 주소값을 이용..