C/C++의 쓰기 시 복사

3016 단어 c + +타임 카피
타임 카피
무엇 을 쓸 때 복사 합 니까?앞에서 내 가 깊 은 복사,얕 은 복사 라 고 했 잖 아.오늘 우리 가 쓸 때 복사 하 는 것 을 탐구 해 보 자.깊 은 복사 본 은 얕 은 복사 의 부족 을 보충 한 것 으로 복사 할 때 복사 하 는 것 은 사실은 깊 은 복사 의 부족 을 보충 하 는 것 이다.사실 쓸 때 복사 한 다 는 뜻 은 이 공간 을 읽 을 때 똑 같은 공간 을 만들어 주지 않 는 다 는 것 이다.네가 진정 으로 복사 가 필요 할 때 그 는 너 에 게 공간 을 열 어 줄 것 이다.지연 판 의 딥 카피 다.

쓰기 시 복사 기술 은'인용 계수'를 통 해 이 루어 집 니 다.공간 을 분배 할 때 4 개의 바이트 를 더 분배 하여 몇 개의 포인터 가 블록 공간 을 가리 키 는 지 기록 합 니 다.새로운 포인터 가 이 공간 을 가리 킬 때 인용 계수 에 하 나 를 더 하고 이 공간 을 방출 하려 면 인용 계수 에서 하 나 를 줄 이 고 인용 계수 가 0 으로 줄 어 들 때 까지 이 공간 을 정말 방출 합 니 다.어떤 지침 이 이 공간의 값 을 바 꾸 려 고 할 때 이 지침 에 자신의 공간 을 분배 합 니 다.

쓸 때 복사 하 는 실 용적:string 클래스 구현

class String 
{ 
public: 
 String(const char *str = "") 
 :_str(new char[strlen(str) + 1 + 4]) 
 { 
 cout << "Sring()" << endl; 
 _str += 4;    // 4            
 GetCount() = 1;   //           1 
 strcpy(_str, str); 
 } 
 
 String(String& s) 
 :_str(s._str) 
 { 
 cout << "Sring(String&)" << endl; 
 GetCount()++; 
 } 
 
 String& operator=(String& s) 
 { 
 cout << "Sring& operator=" << endl; 
 
 if (this != &s) 
 { 
  Release(); 
  _str = s._str; 
  GetCount()++; 
 } 
 return *this; 
 } 
 
 ~String() 
 { 
 cout << "~Sring()" << endl; 
 Release(); 
 } 
public: 
 char& operator[](size_t index) 
 { 
 if (GetCount() == 1)   //      1,      
 { 
  return _str[index]; 
 } 
 GetCount()--; 
 char *tmp = _str; 
 _str = new char[strlen(tmp) + 1 + 4]; 
 _str += 4; 
 strcpy(_str, tmp); 
 GetCount() = 1; 
 return _str[index]; 
 } 
private: 
 int& GetCount() 
 { 
 return *(int *)(_str - 4); 
 } 
 void Release() 
 { 
 if (--GetCount() == 0) 
 { 
  cout << "  " << endl; 
  delete[](_str - 4); //                 4    
  _str = NULL; 
 } 
 } 
private: 
 char *_str; 
}; 
여기에 문제 가 하나 있 습 니 다.C++표준 은 확실히 이 렇 습 니 다.C+표준 은 교체 기 나[]를 통 해 string 의 내부 주 소 를 얻 었 을 때 string 은 읽 을 지 쓸 지 모 릅 니 다.이것 은 확실 하지 않 습 니 다.이 를 위해 내부 인용 을 얻 은 후에 쓰기 동작 을 포착 하지 못 하 는 것 을 피하 기 위해 쓰기 가 폐지 되 었 을 때 복사 기술 을 사용 합 니 다.
이렇게 보면 우 리 는 쓰기 시 복사 할 때 반드시 주의해 야 한다.만약 에 string 의 내 부 를 수정 할 필요 가 없다 면[]연산 자 와 교체 기 를 통 해 문자열 의 내부 주소 인용 을 얻 지 마라.만약 에 네가 반드시 이렇게 해 야 한다 면 대 가 를 치 러 야 한다.물론 string 은 교체 기와 인용 을 무효 화 하 는 방법 도 제공 했다.예 를 들 면 pushback,[]을 사용 한 후에 교체 기 를 사용 하면 인용 이 효력 을 잃 을 수 있 습 니 다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기