개발자 면접 공부/C-C++ 49

구조체, 클래스 패딩 바이트

1. 개요 오늘은 C++의 구조체, 클래스 패딩 바이트에 대해 공부하겠습니다. 2. 크기 구조체와 클래스의 크기는 어떻게 결정이 될가요? 구조체나 클래스는 안에 선언되있는 변수에 따라 결정이 된다고 생각을 하고 있을겁니다. 하지만 실제로 크기를 살펴보면 매우 다르다는것을 알수있습니다. 대부분 내부에 선언되는것보다 매우 많은 크기를 차지하는데요 그것은 패딩 바이트 때문에 그렇습니다. 패딩 바이트란 클래스나 구조체에 패딩 바이트를 추가하여 CPU 접근을 더 용이하게 해 주는 것을 말합니다(정확히 말하면 레지스터의 fetch). 자칫 공간 낭비일 수도 있는 불필요한 패딩 공간을 확보하면서 메모리의 크기를 맞추는 이유는 캐시 hit율을 높이고 CPU의 연산 횟수를 줄이기 위함입니다. 3. 패딩 규칙 패딩 규칙에..

C++11,14 람다식

1. 개요오늘은 람다식에 대해 공부하도록 하겠습니다.2. 람다람다식은 C++11,14에 추가된 표현법으로 보통 익명 함수라고 불립니다. 람다를 저는 학부생때 Java시간때 처음 알게 되었습니다. 그때는 그냥 함수가 간편하게 사용되는 구조인것만으로 끝을 냈습니다. 하지만 이러한 이유때문에 람다를 사용하는경우가 있습니다. 1. 함수 객체와는 다르게 class를 선언할 필요가 없다. (코드의 길이가 줄어듬) 2. 함수 포인터의 단점은 "함수의 인라인화가 불가능합니다" 여기서 인라인은 컴파일러가 함수를 굳이 스택에 쌓아서 부를필요없이 메인함수에서 그 함수만 가지고와 실행하는 기법입니다. 하지만 람다는 "함수의 인라인"이 가능합니다.3. 람다 표현식보통 람다표현식은 다음과 같습니다. #include using n..

상수와 리터럴 (Constant & Literal)

오늘은 상수(Constant) 와 리터럴(Literal)에 대해서 알아보도록 하겠습니다. 1. 개요 C++ 에서는 const 라는 상수를 지정할수있는 선언문이 있습니다. 이 const 라는 키워드를 붙힌 변수는 반드시 선언 당시에 초기화를 진행시켜줘야하고 그 다음에 절대로 값이 변하지가 않습니다. 그럼 리터럴은 무엇일가요?? 아래 내용을 정리하면서 설명을 해 드리겠습니다. 2. 상수 (Constant) 상수는 말 그대로 수식에서 변하지 않는 값을 의미합니다. 값이 변하는 변수와의 반대에 의미를 가지고있습니다. const int a = 5; // 반드시 초기화를 진행해줘야한다. a = 6 // 에러 Type이 const int type입니다. 예시로 const 를 넣으면 반드시 초기화를 진행시켜줘야하며 a..

정렬 알고리즘(퀵, 병합)

오늘은 정렬 알고리즘 중에 퀵, 병합 정렬에 대해 알아보도록 하겠습니다. 1. 개요 저번 포스팅에서는 버블, 삽입, 선택 정렬에 대해 알아보았다면 요번에는 퀵, 병합, 힙 정렬에 대해 알아봅시다. 버블, 삽입, 선택은 시간 복잡도가 그렇게 좋진않았지만 단순한 알고리즘이였습니다. 그에 반대로 퀵, 병합, 힙은 시간복잡도가 좋지만 복잡한 알고리즘입니다. 2. 퀵 정렬(Bubble Sort) 퀵 정렬은 분할 정복 방법을 통해 주어진 배열을 정렬하는 방식입니다. 여기서 분할 정복 이란? 분할 정복 : 문제를 작은 2개의 문제로 분리하고 각각을 해결한 다음, 결과를 모아서 원래의 문제를 해결하는 전략 입니다. 퀵 정렬은 불안정 정렬에 속하며, 다른 원소와의 비교만으로 정렬을 수행하는 비교 정렬에 속한다. 또한, ..

정렬 알고리즘 (버블, 삽입, 선택)

오늘은 정렬 알고리즘에 대해 알아보도록 하겠습니다.1. 개요많은 컴퓨터 과학자들은 어떻게하면 좀더 쉽고 빠르게 배열을 정렬할수있는지에 대해 많은 연구를 하였습니다. 그 중에서 빠르진 않지만 쉬운 정렬인 (버블, 삽입, 선택) 정렬 에대해 알아보도록 하겠습니다.2. 버블 정렬(Bubble Sort)버블정렬은 선택정렬과 유사합니다. 서로 인접한 두 원소를 비교하고, 조건에 맞지않으면 자리를 교환하는 알고리즘입니다. 매우 쉬운 알고리즘 입니다. 버블 정렬의 과정은 다음과 같습니다.1화전에 첫 번쨰 원소와 두 번째 원소 비교 다시 두 번째 원소와 세 번쨰 원소의 비교 점점 나아가 마지막 원소 -1 과 비교하여 조건이 맞지 않으면 서로 자리를 변경한다.1회전을 수행하고 나면 가장 큰 수가 맨 뒤 원소로 향하고 2..

virtual 생성자와 생성자 안에 virtual 함수 부르는 설명

안녕하세요 오늘은 virtual 생성자와 생성자 안에 virtual 함수를 부르면 어떤 현상이 일어나는지에 대해 알아보도록 하겠습니다. 1. 개요 보통 virtual이 선언된 함수나 상속은 RTTI를 사용하여 현재의 객체의 타입 정보를 알수있는 효과를 가지고있습니다. RTTI나 virtual에 대해서는 아래 링크에서 자세히 포스팅 해놓았으니 읽어 보시길 바랍니다. https://chogyujin-study.tistory.com/25 C++ RTTI 에 대해 오늘은 RTTI에 대해 공부하겠습니다. RTTI란? Run Time Type Information의 약자로 프로그램 실행 중에 개체의 형식이 결정될 수 있도록 하는 매커니즘입니다. 다시 말해 실행중 포인터가 가르키는 객체의 chogyujin-study..

RVO vs NRVO

오늘은 RVO 랑 NRVO 에 대해서 알아보도록 하겠습니다. 1. 개요 RVO 랑 NRVO는 함수에서 C++ 객체지향을 어떻게 하면 빠른 속도와 컴파일러단에서 부터 코드를 최적화 시켜서 더욱 빠르고 정확하게 실행 할 수 있는지에 대한 내용입니다. 대표정으로 RVO 와 NRVO 가 있습니다. RVO = Return Value Optimization NRVO = Named Return Value Optimization 2. RVO VS NRVO #include #include #include using namespace std; class A { private: string s; public: A(string s) : s(s) { cout

Constexpr VS Const

오늘은 Constexpr과 Const 의 차이점을 공부하도록 하겠습니다. 1. 개요 const 에 대해서는 프로그래밍 언어를 공부해본 사람들은 다 알고있는 사실인 상수 변수를 선언할때 쓰는 선언문입니다. 하지만 C++을 공부하면서 constexpr에 대해 알게되었고 매우 흥미로운 선언문이라는것도 알게되었습니다. 그래서 오늘은 const 와 constexpr 에 대해 알아보도록 하겠습니다. 2. Const (상수) const 는 일반적으로 모든 프로그래밍 언어??에서 상수역활을 합니다. 한번 초기화된 상수 변수는 다신 변수의 저장된 값을 변경할수가 없습니다. 또한, const는 선언과 동시의 초기화 작업을 이루어져야하는 값 입니다. ex) const int a = 5; // 성공적인 초기화 const in..

const int* p 와 int * const p의 차이점

1. 개요 오늘은 const int* p 와 int* const p의 차이점을 공부하도록 하겠습니다. 2. 설명 const 는 상수 이므로 대상 변수를 선언한뒤 초기화를 해주면 값을 변경을 안해주는 것을 의미합니다. ex) const int a=5; a = 6; // 에러 대상은 상수이므로 변경을 할수 없음 이런 경우에는 대상이 상수이므로 값을 변경할수 없습니다. 그러면 const int * p = new int(5); 라는 식은 처음의 초기화를 진행했지만 나중에 값을 변경을 못하는것일가여 아니면 주소값을 변경을 못하는것 일가여?? 3. const int * p == int const * p 결론 부터 말씀드리면 const int* p 는 *p의 값 즉 Heap에 저장되있는 값을 변경을 못하는 것 입니다..

C++ 템플릿(함수 템플릿)

오늘은 C++의 템플릿에 대해 공부하도록 하겠습니다. 템플릿 이란? C++에서 제공해주는 기능으로 함수나 클래스를 개별적으로 다시 작성하지 않아도, 여러 자료 형으로 사용할 수 있도록 하게 만들어 놓은 틀 입니다. 템플릿은 두가지로 함수형 템플릿 과 클래스형 템플릿 으로 나눠집니다. 템플릿은 말 그대로 자료형에 따라 함수를 여러번 정의할 필요없이 template를 함수 위나 클래스 위에 정의하고 사용하면 인자값을 전달할때 그거에 맞는 매개변수로 자료형으로 변환해주는 기법입니다. 함수 템플릿(Function Template) 함수를 만들어 낼때, 함수의 기능은 명확하지만 자료형을 모호하게 두는 것 아래의 코드를 보면서 설명하겠습니다. int sum(int a, int b) { return a + b; } ..