반응형

2025/11/30 9

new 와 malloc

new 와 malloc 둘다 동적으로 메모리를 할당 하기 위해 사용한다 malloc 함수는 메모리를 할당만 하기 때문에 객체의 생성을 올바르게 실행시키지 못한다. 그래서 c++에서는 new 를 사용하여 객체를 초기화 한다newc++연산자메모리를 할당하는 동시에 객체의 생성자를 자동으로 호출하여 객체를 초기화하고 해제시에 소멸자를 호출한다.클래스/객체 타입에 메모리 할당할떄 new 와 delete 를 사용해여 한다.요청한 타입의 포인터를 반환하므로 별도의 형변환이 필요 없다. (타입 안정성이 높다)메모리 할당 실패하면 std::bad_alloc 예외(exception)를 던짐.연산자 오버로딩이 가능, 메모리 할당 방식을 커스터 마이징 할 수 있다. 또한 배열 할당 연산자도 존재(new[])mallocC 표..

c++/객체지향 2025.11.30

전위연산자 와 후위연산자의 동작 차이

1. 전위 증가 연산자( Prefix Notation )연산자 ++ 가 피연산자 n 보다 앞에 위치할때먼저 값/ iterator 를 증가시킨다증가된 자기 자신 객체를 반환한다불필요한 복사가 없다 = 복사 비용이 없다반환 타입 = 참조타입l-valueT& operator++() { this->value += 1; // 실제 증가 return *this; // 자기 자신을 참조로 반환}2. 후위 증가 연산자( Postfix Notation )연산자 ++ 가 피연산자 n 보다 뒤에 위치할때증가하기 전 값을 임시 객체를 생성 후 복사(보관)원본을 증가 시킴증가 전 값 (임시객체) 를 반환복사 비용이 발생반환타입 = 값r-valueT operator++(int) { T old = *..

c++/객체지향 2025.11.30

RTTI(Run Time Type Information)

런타임에 vtable과 추가적인 타입 메타 데이터를 사용하여 객체의 실제 타입을 확인하는 동적 메커니즘, 약간의 메모리 성능 오버헤드가 발생 할 수 있다.프로그램 실행 중(런타임)에 객체의 실제 타입을 확인한다순수 가상 함수가 있어야 한다.dtnamic_cast 연산자나 typeid 연산자를 사용한다주로 다형성을 활용할 때 상위 클래스 포인터가 실제 어떤 하위 클래스 인스턴스를 가르키는지 확인 할 때 사용한다 vtable(가상 함수 테이블) 개념vtable은 가상 함수를 하나 이상 포함하는 클래스에서 컴파일러에 의해 생성되는 virtual 함수들의 실제 함수 주소를 순서대로 저장하는 정적 배열이다 . c++에서 런타임 바인딩을 정적 타이핑 기반codehortus.tistory.com클래스에 가상 함수가..

c++/객체지향 2025.11.30

RAII

Resource acquisition is initialization 자원 획득을 초기화 한다.RAII 는 자원 관리를 위한 c++ 디자인 패턴 스마트 포인터,컨테이너,락 가드 등 모두 RAII 기반자원 누수를 방지하고 안전한 자원 관리를 보장생성자에서 자원을 획득하고 소멸자에서 자동으로 자원을 해제한다코드가 스코프를 벗어날때 자원이 자동으로 정리된다자원의 획득(alloction) 과 해제(release)를 객체의 생성자.소멸자에 묶는다. 생성자 → 자원 획득(new, 파일열기, 뮤텍스 잠금 등) 소멸자 → 자원 해제(delete,파일닫기,잠금 해제 등) → 이렇게 하면 스코프를 벗어나면 자동으로 소멸자 호출 → 자원 누수 방지RAII는 언어의 특정 키워드나 내장 기능이라기보다는 C++ 언어의 기본 특성..

c++/객체지향 2025.11.30

C++ 4대 캐스트(cast)

타입 안정성과 의도를 명확히 하기 위한 규칙1. static_cast전통적·정상적인 변환을 수행할 때 사용하는 기본 캐스팅입니다.특징컴파일 타임에 검증 가능한 변환을 수행합니다.암시적 변환이 가능한 경우 → static_cast로도 명시적으로 가능.다운캐스팅(부모 → 자식) 가능하지만, 타입 안전성은 보장하지 않습니다.사용 예double d = 3.14;int n = static_cast(d); // 정수 변환Base* b = new Derived();Derived* d1 = static_cast(b); // 다운캐스팅(안전 검증 없음)주의점포인터 간 캐스팅은 타입 오류를 검증하지 않기 때문에 잘못된 형태면 런타임에서 UB 발생.객체 수명과 RTTI를 사용할 수 있는지 고려해야 합니다.2. dynam..

c++/객체지향 2025.11.30

[c++] 포인터*와 참조&

포인터 : 다른 변수의 주소 값을 저장하는 변수, 주소 자체가 값(value)이다독립된 메모리 공간을 가진다재할당시 저장된 주소 값이 변경된다.간접참조사용처유연성, 주소 연산, 존재 자체를 제어할 때 사용동적 메모리 할당.(힙 메모리 수명 직접 관리 , 게임 엔진, 커스텀 메모리 풀, ECS 구현 등)객체가 없을 수도 있는 상태를 표현할 때배열, 버퍼, 메모리 블록을 직접 다룰 때(메모리를 직접 가르키고 이동 할 수 있기 때문)다형성을 의도적으로 포인터로 표현할 때C API와의 연동(C언어 함수들은 반드시 포인터를 사용한다)존재 여부, 배열 이동, 주소 조작이 필요한 경우int a = 10 , b = 5;int* p = &a;int* p1 = nullptr // ok 선택적으로 초기화 할 수 있음p = ..

c++/객체지향 2025.11.30

vtable(가상 함수 테이블) 개념

vtable은 가상 함수를 하나 이상 포함하는 클래스에서 컴파일러에 의해 생성되는 virtual 함수들의 실제 함수 주소를 순서대로 저장하는 정적 배열이다 . c++에서 런타임 바인딩을 정적 타이핑 기반 언어에서 허용하기 위해 채택환 관습적 기법virtual 함수가 있는 클래스의 객체들은 가상 포인터 vptr(8byte)을 하나 가지고 vptr은 객체 타입의 vtable을 가르킨다.vptr : 가상 테이블 포인터로 객체의 첫번째 멤버로 배치되는 것이 관습적c++이 런타임 바인딩을 정적 타이핑 기반 언어에서 허용하기 위해 채택한 관습적 기법이다 .GCC, Clang, MSVC는 각각 C++ ABI(응용 프로그램 이진 인터페이스**)**의 구현이 다르며, 이로 인해 vtable의 레이아웃과 동작 방식에도 차..

c++/객체지향 2025.11.30

순수가상함수

선언만 있고 구현이 없는 가상함수, 상속 관계에서 파생 클래스가 특정 함수를 반드시 재정의 하도록 강제하는 역활virtual void functionName() = 0;순수 가상 함수가 하나라도 있으면 해당 클래스는 추상 클래스라 하고 객체(인스턴스) 를 생성 할 수 없고 다른 클래스의 상속을 주기 위한 목적으로 사용됨virtual 이 없으면 =0 키워드를 쓸 수 없음왜 필요한가부모 클래스가 공통된 규약 만 정하고구현은 자식 클래스가 책임 지도록 강제하는 방식객체지향 설계에서 인터페이스와 추상 계층을 분리할 때 가장 흔히 쓰인다.작동 방식(vtable관점) vtable(가상 함수 테이블) 개념vtable은 가상 함수를 하나 이상 포함하는 클래스에서 컴파일러에 의해 생성되는 virtual 함수들의 실제 함..

c++/객체지향 2025.11.30

unordered_map & unordered_set

해쉬 테이블(Hash Table)기반으로 삽입,삭제,검색 모두 평균 O(1)의 시간 복잡도를 가지며이름에서 알 수 있듯이 정렬하지 않은 상태로 저장된다. 평균 시간 복잡도 = O(1), 해시 충돌이 전부 한 버킷에 몰릴 최악의 경우 O(n) 이지만 드물다. 내부 순서는 해시에 의해 결정되고 정렬 규칙이 없다.버킷 구조 : key의 hash 값을 버킷 인덱스로 변환하여 저장한다.충돌 해결 방식 -> 체이닝 방식 : 같은 버킷에 여러 원소가 들어 갈 수 있으며 연결리스트 또는 비슷한 구조로 관리내부적으로 vector와 list 를 같이 쓰기 떄문에 메모리가 필커스텀 해시 가능 : 구조체, 클래스를 key 로 쓰려면 hash 함수와 ==연산자를 제공해야 한다.std::unordered_map key-value..

c++/STL 2025.11.30
반응형