[C++] placement new
C++๋ก ์์ฉํ๋ก๊ทธ๋จ์ ๋ง๋ค๋ค๋ณด๋ฉด new๋ฅผ ์ฌ์ฉํ ๋์ ํ ๋น์ ์์ฃผ ์ฌ์ฉํ๊ฒ ๋ ๊ฒ์ด๋ค.
ํ์ง๋ง ๋์ ํ ๋น์ ์๊ฐ๋ณด๋ค ๋น์ผ ๋
์์ด๋ค.
๋จ์ํ ์ญ์ฐธ์กฐ๋ง ํ๋๊ฑด ๊ทธ๋ ๊ฒ ๋ฌด๊ฒ์ง ์์ง๋ง, ํ ๋นํ๊ณ ์ง์ฐ๋ ๊ฒ ์์ฒด๊ฐ ์ข ๋ฌด๊ฑฐ์ด ํธ์ด๋ค
ํ ๊ด๋ฆฌ๊ฐ์๊ฑด ๊ธฐ๋ณธ์ ์ผ๋ก OS๋จ์์ ํ๊ธฐ๋๋ฌธ์ OS์ ์์ฒญ์ ๋ ๋ฆฌ๋ ํํ๋ก ๋์ํ๋๋ฐ, ์ด๊ฑธ ํจ์ํ๋๊ฑธ ์จ์ ๊ทธ๋ ์ง ์ด์ ๋ธ๋ฆฌ ์ฝ๋๋ก๋ ๋ณดํต ์๋ฐฑ์ค์ด ๋์ด๊ฐ๋ค.
์์ฃผ ์ฌ์ฉํ์ง๋ ์์ง๋ง, ๊ทธ๋งํผ์ ๋ญ๋น๋ ๊ทน๋จ์ ์ผ๋ก ์ค์ด๊ณ ์ถ๋ค๋ฉด ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ค.
placement new๋ผ ๋ถ๋ฆฌ๋ new์ ํน์๊ตฌ๋ฌธ์ด๋ค.
๋ฏธ๋ฆฌ ์ฐ๋ฆฌ๋ง์ ์ปค์คํ ํ ๊ณต๊ฐ์ ๋ง๋ค๊ณ , ๊ฑฐ๊ธฐ์ ํ ๋น์ ์ํค๋ ๊ฒ์ด๋ค.
์ฌ์ฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
์ ๋นํ ๋ฉ๋ชจ๋ฆฌ ์ํ์ค๋ฅผ ์์ฝํ๊ณ , ๊ทธ ์ฃผ์๋ฅผ new์ ์ธ์ง๋ก ๋๊ธฐ๋ฉด ๋๋ค.
์ด ๋ฉ๋ชจ๋ฆฌ ์ํ์ค์๋ ๋ณ๋ค๋ฅธ ์ ์ฝ์ ์๋๋ฏํ๋ค. ์ฐ๊ธฐ๋ง ํ ์ ์์ผ๋ฉด ๋๊ธฐ๋๋ฌธ์ ์์ฒ๋ผ ์ ์ ๋ฐฐ์ด์ด์ด๋ ๋๊ณ , ๋์ ํ ๋น์ ํด๋ ๋๊ณ
๋ค์๊ณผ ๊ฐ์ด ๊ฐ์ ๋ก ์ ๊ทผํด์ ๊ฐ์ ๋ฐ๊พธ๋ ํ๋ง๋ฒ๋ ๊ฐ๋ฅํ๋ค.
์ฃผ์ ๊ด๋ฆฌ
๊ทผ๋ฐ ์ด๊ฒ๋ ์ ๋๋ก ์ฐ๋ ค๋ฉด ๊ณ ๋ คํ ๊ฒ ๋ง๋ค.
๊ทธ๋ฅ pool ์ฃผ์๋ง ๋ฌด์์ ๋ฃ์ผ๋ฉด ๊ทธ ์์์ฃผ์๋ก ๋ฎ์ด์ฐ๊ธฐ ๋๋ฌธ์, ํ ๋นํ๊ณ ํด์ ํ ๋๋ง๋ค ์ฃผ์ ๋ฒ์๋ฅผ ๊ด๋ฆฌํด์ค์ผ ํ๋ค.
๋ถํธํ๋ค.
alignment
ํ์ง๋ง ์ ์ฃผ์๊ด๋ฆฌ๋ฒ์๋ ์ฝ๊ฐ ๋ฏธ์งํ ๋ถ๋ถ์ด ์กด์ฌํ๋ค.
๋ฉ๋ชจ๋ฆฌ ์ ๋ ฌ(memory alignment)๋ผ๊ณ ๋ค์ด๋ดค๋๊ฐ? ์ด๊ฑด cpu์ ๋์ ํจ์จ์ฑ์ ๊ดํ ๋ฌธ์ ์ธ๋ฐ,
๋ง์ฝ 2๋ฐ์ดํธ ๋ฐ์ดํฐ์ 1๋ฐ์ดํธ ๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด, ๊ทธ 2๊ฐ๋ฅผ ์์๋๋ก 3๋ฐ์ดํธ๋ก ์๊ธฐ๋ณด๋จ cpu์ ์ฒ๋ฆฌ๋จ์๋ก ์๋ผ์ฃผ๋ ๊ฒ์ด ํจ์ฌ ๋น ๋ฅด๋ค๋ ๊ฒ์ด๋ค.
๊ทธ๋์ cpu์ ์ฒ๋ฆฌ๋จ์๊ฐ 4๋ฐ์ดํธ๋ผ๋ฉด, ์ค๊ฐ์ ์ฌ๋ฐฑ์ ๋ฃ์ด์ 2๋ฐ์ดํธ(4๋ฐ์ดํธ ์ฐจ์ง), 1๋ฐ์ดํธ(4๋ฐ์ดํธ ์ฐจ์ง)์ ํํ๋ก 8๋ฐ์ดํธ๋ฅผ ์ ์ ํ๊ฒ ํ๋๊ฒ ํจ์จ์ ์ผ ์ ์๋ค.
์ด ๊ฒฝ์ฐ์๋ ๋ง์ฐฌ๊ฐ์ง๋ค.
๋จ์ํ ์ฌ์ด์ฆ๋ก๋ง ์ฃผ์๋ฅผ ๊ด๋ฆฌํ๋, 3๋ฐ์ดํธ, 2๋ฐ์ดํธ๋ฅผ ๋ฌด์์ ์๊ณ ์์๋ค.
์ด๋ฐ๊ฑธ ํด๊ฒฐํ๋ ค๋ฉด align์ ๋ค ์ง์ ํด์ค์ผ ํ๋ค.
์ด๋ฐ์์ผ๋ก ๋ง์ด๋ค.
๊ทผ๋ฐ ์ด ๊ธฐ๋ฅ ์์ฒด๋ฅผ ์ฌ์ฉํ ์ผ์ ๋ง์ง ์์๊ฒ์ด๋ค. ๋๋ถ๋ถ์ ํ๊ฒฝ์์๋ ์ ์ ๋์ ์ฑ๋ฅ์ด ํ์ํ์ง๋ ์๊ณ , ๊ด๋ฆฌ๋์ด๋๋ง ๊ธ๊ฒฉํ๊ฒ ์์นํ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฆฌ์์ค๊ฐ ๊ทน๋จ์ ์ผ๋ก ์ ํ๋ ๋๋ง ์ฌ์ฉํ๊ธธ ๊ถํ๋ค.
์ฐธ์กฐ
https://woo-dev.tistory.com/m/217
https://www.geeksforgeeks.org/placement-new-operator-cpp/