- 위치지정 new
개념 : 사용할 위치를 사용자가 지정할 수 있다
이 위치란 말이 처음에는 헷갈렸는데 주소라고 변경해도 될거같다
사용법은 new의 매개변수에 사용할 주소를 추가로 넣어주면 된다
기존 new는 힙에서 할당을 해오지만
위치지정 new는 메모리 관리를 모두 개발자에게 맡기기 때문에
힙영역, 정적영역, 스택영역의 메모리에도 지정할 수 있었다.
메모리 해제 같은 경우 참조한 메모리의 영역에 맞추어 하면 된다.
힙 같은 경우는 사용자가 해제 해주어야 하니 delete를 써주면 되고
정적, 스택 영역 같은 경우는 자동으로 해제되니 맡기면 된다.
맨 위에서 2번째 예시의 코드의 int * pa = new (&a) int; 는 사실 int * pa = &a; 와 같아 보이는데
이처럼 그냥 대입하면 되지 왜 만들었을까 생각을 했다
https://ehei.tistory.com/505
이런 기능이 필요한 이유는 다음과 같다. 힙을 할당하는 건 많은 비용이 든다. 메모리의 정합성을 유지하기 위해 운영체제가 수행해야하는 작업이 있다. 가상 메모리, 페이지 단위 관리, 그리고 메모리 파편화를 피하기 위한 재배치가 그런 것들의 예이다. 여기에 드는 비용은 프로그래머가 예상할 수 없다. 그러나 발생하면 치명적이다. 정체불명의 랙이 생길 수도 있다. 따라서 보통은 메모리풀이란 개념으로 대량의 연속된 메모리를 할당받는다. 그리고 위치지정 new를 이용하여 객체를 그곳에 생성한다
다른 생성자 문제도 있겠으나 이렇게 메모리 관리를 위해 사용하는 느낌이 더 강하게 왔고
메모리 풀에도 쓰인다하니 나중에 더 알게될듯 하다.
- 선언영역 & 잠재 사용 범위
선언영역(declarative region) : 선언을 할 수 있는 영역
ex) 어떤 변수를 함수 밖에 선언한다면 선언영역은 선언된 파일이다
어떤 변수를 함수 안에 선언한다면 선언영역은 선언된 블록이다
잠재 사용 범위(potential scope) : 간단히 사용 영역
ex) 변수를 함수안에 선언하면 잠재 사용 범위는 "변수 선언 ~ 함수 끝" 이다
- 이름 공간
전역 이름 공간 - 우리가 보통 전역변수를 생성할때 이 전역 이름 공간에 만들고 있었다
namespace - 사용자가 정의하는 이름 공간
이 namespace는 무조건 전역이름공간에 생성될수밖에 없기 때문에
안에 들어있는 변수나 함수는 전역적 속성을 가진다
namespace이지만 이름이 생략된 공간 - 내부링크속성을 띄는 정적변수라 볼수있다
- using선언 & using지시
using 선언 : 간단히 이름공간 안에 있는 하나의 변수, 혹은 함수를 using이 사용된 공간에 사용한다는 뜻
단 짚고 넘어가야할 것은 지역이름 공간에 넣는다는 뜻이다
이렇게 선언한 식별자는 같은 공간내에 중복으로 선언 불가능해진다
이유는 위에 언급했듯이 지역이름공간에 넣기때문에 그렇다
using 지시 : namespcae 전체를 접근하게 한다
주의할 점은 using선언과 달리 전역적으로 사용한다는 것이다
위에서 언급했듯이 선언과는 다르게 이렇게도 가능하다
mySpace에 소속된 space1과 같은 식별자를 지역변수로 선언 할 수 있다
이 부분이 굉장히 헷갈렸었는데
위에서 말했듯이 선언은 지역이름공간에 넣어주고
지시는 전역적으로 사용하게끔 하기 때문에 이런 차이가 날 수 있게 된것이다.
'C++ > [책] C++ 기초 플러스' 카테고리의 다른 글
[ 651p ~ 684p ] 생성자, 디폴트생성자, 파괴자, const멤버함수, this포인터 (0) | 2021.08.24 |
---|---|
[ 616p ~ 650p ] 추상화, 클래스, 사용자 범위 결정 연산자, 인라인 메서드, 멤버함수 (0) | 2021.08.24 |
[ 590p ~ 595p ] thread_local, volatile, mutable, const의 내부링크, 함수와 링크, 단일 정의 규칙 (0) | 2021.08.18 |
[ 559p ~ 589p ] 분할컴파일, #ifndef & #endif, Linkage, extern, static, 정적&전역&정적지역 변수 (0) | 2021.08.16 |
※[ 535p ~ 558p ] 오버로딩분석, decltype, 후위반환타입 (0) | 2021.08.12 |