맨 위에서 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이 사용된 공간에 사용한다는 뜻