함수 호출 로그는
cout << __func__ << endl;
스택 프레임 : 함수간 메모리공간을 격리시키는 역할
스택영역에서는 동작방식때문에 컴파일 시점에 각 스택 프레임의 크기가 결정되어야 한다. 스택 프레임의 크기가 사전에 결정되기 때문에 가변 크기 배열을 함수의 로컬변수로 선언할 수 없다.
<memory> 헤더에 unique_ptr이라는 스마트 포인터가 있음.
unique_ptr<int[]> myVar (new int[arraySize]);
shared_ptr<AirlineTicket> myTicket2(new AirlineTicket());
AirlineTicket* myTicket3 = new AirlineTicket();
delete myTicket3;
auto smartCellp = std::make_unique<SpreadsheetCell>(4);
auto mySimpleSmartPtr = make_shared<Simple>();
일일이 메모리 해제를 신경쓰지 않아도 되도록 해줌.
해당 메모리가 스코프에서 벗어날 때 자동으로 메모리 해제를 수행한다.
*: 역참조
필드접근 : .
역참조 + 필드접근 : →
.get()함수로 함수 파라미터로 전달
.resut() : 리소스 해제후 nullptr로 초기화
mySimpleSmartPtr.reset(new Simple()); : 리소스 해제후 새로운 Simple 인스턴스로 설정
unique_ptr은 단독 소유권을 표현하기 때문에 복사할 수 없다.
shared_ptr의 경우, use_count()로 동일 리소스를 공유하는 shared_ptr의 개수를 알 수 있다.
vector를 사용하는 이유 : 유연하고 안전하다.
vector를 사용하면, 런타임에 동적으로 항목을 추가/삭제할 수 있고 그에 따른 메모리 할당/해제도 자동으로 해주기 때문에 편리하다. 이러한 컨테이너 항목을 순회하기 위해 iterator개념이 있다.
#include<string>
#include<vector>
#include<iostream>
using namespace std;
int main(){
// 문자열 벡터 객체 생성. c++11의 유니폼 초기화를 이용
vector<string> myVector = {"A first string", "A second string"};
myVector.push_back("A third string");
myVector.push_back("The last string in the vector");
for(auto iterator = myVector.cbegin(); iterator != myVector.cend(); ++iterator){
cout << *iterator << endl;
}
for(auto& str : myVector) cout << str << endl;
return 0;
}
for(vector<string>::const_iterator iterator = myVector.begin();
iterator != myVector.end(); ++iterator){
cout << *iterator << endl;
}
C++ 디자인의 두가지 원칙
:: 추상화, 재사용
추상화 : 내부 구현과 외부 인터페이스를 깨끗하게 분리
재사용 :
s : 작업준비시간
C : 비례상수
t : 작업정리시간
외부업체 : 3rd party
void* 형식은 type-safe하지 않다.
즉, 데이터를 이용하거나 저장할 때 그 타입이 목적하는 것과 같은지 검사할 방법이 없다.
데이터를 이용하려면 void* 내에 의도했던 타입으로 다시 캐스팅해야하는데 이러한작업은 원래 데이터 타입이 캐스팅하는 타입과 다를 수도 있기 때문이다.
출처 : 전문가를 위한 C++
'C++ STL, 알고리즘' 카테고리의 다른 글
C++ 생성자 (0) | 2024.10.02 |
---|---|
OOP (0) | 2024.10.02 |
c++ static (0) | 2024.10.02 |
c++ 복습을 위한 링크 (0) | 2024.08.30 |
DP 다이나믹 프로그래밍 Dynamic Programming (0) | 2023.11.22 |