(C++ : Move Semantics-5) move 예제

Posted by : at

Category : Cpp


move를 활용한 버퍼 복사

#include <iostream>
#include <vector>
#include <type_traits>
#include "Test.h"
using namespace std;

int main()
{
  Test* p1 = new Test[2];
  Test* p1 = static_cast<Test*>(operator new(sizeof(Test)*2));  
  // Test에 디폴트 생성자가 없다면 이런 선언도 좋다.(메모리만 할당)
  
  for(int i = 0; i < 2; i++)
    new(&p1[i]) Test;
  
  Test* p2 = new Test[4];   // 얘는 복사 받을 버퍼인데 디폴트 생성자로 메모리 초기화를 해줘야하나? -> 이것 또한 오버헤드아닌가? -> 메모리만 있으면 될 거 같다!

  // 1. 신규 버퍼는 메모리만 할당하자.
  Test* p2 = static_cast<Test*>(operator new(sizeof(Test)*4));
  
  for(int i = 0; i < 2; i++)
    p2[i] = move(p1[i]);    // move 대입 호출, 위에서 생성자를 호출하지 않았기에 
    new(&p2[i]) Test(move(p1[i]));  // move 생성자를 호출하면 된다.
    new(&p2[i]) Test(move_if_noexcept(p1[i]));    // 더 좋은 코드!
    
  // 2. 새로운 객체는 디폴트 생성자 호출
  for(int i = 2; i < 4; i++)
    new(&p2[i]) Test;   // 디폴트 생성자 호출
    
    
  // 버퍼 파괴
  for(int i = 1; i>=0;i--)
    p1[i].~Test();
  operator delete(p1);
  
  for(int i = 3; i>=0;i--)
    p2[i].~Test();
  operator delete(p2);
}
// STL vector를 쓴다면?
vector<Test> v(2);
v.resize(4);
// 위와 동일한 작업을 수행하게 된다.

About Taehyung Kim

안녕하세요? 8년차 현업 C++ 개발자 김태형이라고 합니다. 😁 C/C++을 사랑하며 다양한 사람과의 협업을 즐깁니다. ☕ 꾸준한 자기개발을 미덕이라 생각하며 노력중이며, 제가 얻은 지식을 홈페이지에 정리 중입니다. 좀 더 상세한 제 이력서 혹은 Private 프로젝트 접근 권한을 원하신다면 메일주세요. 😎

Star
Useful Links