c+임시 대상 의 출처

4835 단어 임시 대상
먼저 아래 코드 를 보십시오. 결과 2-----1    아마도 대부분의 원우 들 은'int temp'이'임시 대상'이 라 고 생각 하지만 사실은 그렇지 않 습 니 다.'int temp'은 swap 함수 의 부분 변수 일 뿐 입 니 다.
임시 대상 은 코드 에서 볼 수 없 지만 실제 프로그램 에 존재 하 는 대상 입 니 다.임시 대상 은 컴 파일 러 에 의 해 감지 된다.
왜 임시 대상 을 연구 합 니까?주로 프로그램의 성능 과 효율 을 향상 시 키 기 위해 서 이다.임시 대상 의 구조 와 분석 구 조 는 시스템 비용 에 도 적지 않 기 때문에 우 리 는 그들 이 어떻게 발생 하 는 지 알 고 가능 한 한 그들 을 피해 야 한다.임시 대상 이 이름 이 없 는 비 더미 대상 을 만 들 면 임시 대상 이 생 길 수 있 습 니 다.(쌓 는 대상 과 쌓 이지 않 는 대상 이 무엇 인지 모 르 겠 습 니 다.C++당신 이 하지 않 는 것 이 좋 은 이 박문 을 참고 하 세 요.이 안에 소개 가 있 습 니 다.)이러한 이름 없 는 대상 은 보통 세 가지 조건 에서 발생 합 니 다.함 수 를 성공 적 으로 호출 하기 위해 암시 적 형식 변환 을 할 때,전달 함수 파라미터 와 함수 가 대상 으로 돌아 갈 때 입 니 다.그럼 우선 함 수 를 성공 적 으로 호출 하기 위해 암시 적 형식 으로 전환 하 는 것 을 보 세 요

 #include <iostream>
 void swap( int &a,int &b)
 {
     int temp;
     temp=a;
     a=b;
     b=temp;
 }

 int main(int argc,char** argv)
 {
     int a=1,b=2;
     swap(a,b);
     std::cout<<a<<"-----"<<b<<std::endl;
     return 0;
 }
결 과 는
여기 서 함수 countChar(const std::string&s,const char&c)를 호출 합 니 다.그러면 이 함수 의 형 삼 은 const std::string&s 이 고 형 삼 유형 은 const std::string 이지 만 실제 적 으로 char buffer[200]라 는 배열 을 전달 합 니 다.사실 여기 컴 파 일 러 는 함수 호출 을 성공 적 으로 하기 위해 형식 변환 을 했 습 니 다.char*형식 은 std:string 형식 으로 바 뀌 었 습 니 다.이 변환 은 할당 구조 함 수 를 통 해 이 루어 졌 습 니 다.buffer 를 매개 변수 로 std::string 형식의 임시 대상 을 구축 합 니 다.constChar 가 돌아 올 때 함수 가 취소 되면 이 std::string 임시 대상 도 방출 됩 니 다.그러나 사실은 전체 프로그램 에서 임시 대상 의 구조 와 방출 은 불필요 한 비용 이다.우 리 는 코드 의 효율 을 향상 시 키 고 코드 를 수정 하여 상 관 없 는 전환 을 피 할 수 있다.그래서 임시 대상 의 출처 를 알 면 프로그램의 성능 을 약간 향상 시 킬 수 있다.
   전송 방식 으로 대상 을 전달 하거나 상수 인용 파 라 메 터 를 전달 해 야 이러한 유형의 전환 이 발생 할 수 있 으 며,비상 인용 을 전달 하 는 매개 변수 대상 은 발생 하지 않 습 니 다.매우 많은 인용 매개 변 수 를 전달 하 는 의 도 는 함 수 를 통 해 전달 매개 변수의 값 을 바 꾸 려 는 것 이지 만 함 수 는 변 경 된 유형 변환 으로 만들어 진 임시 대상 이기 때문에 의도 가 실현 되 지 않 고 컴 파일 러 는 아예 거절 합 니 다.
두 번 째 상황 은 여러분 이 잘 아 는 함수 가 파 라 메 터 를 전달 할 때 해당 하 는 임시 대상 을 구성 하 는 것 입 니 다.다음 코드 가 실 행 된 결 과 를 보면 분명 알 것 이다

 #include <iostream>
  int countChar(const std::string & s,const char c)
  {
      int count=0;
      for(int i=0;i<s.length( );i++)
      {
          if(*(s.c_str( )+i) == c)
          {
              count++;
         }
    }
     return count;
 }

 int main(int argc,char** argv)
 {
     char buffer[200];
     char c;
     std::cout<<"please input the string:";
     std::cin>>buffer;
     std::cout<<"please input the char which you want to chount:";
     std::cin>>c;
     int count=countChar(buffer,c);
     std::count<<"the count is:"<<count<<std::endl;
     return 0;
 }
결 과 는:

여기 서 앞의 두"h2"는 구조 함수 People(std:string n,int a)을 호출 하여 인쇄 한 것 이 고"h3"는 복사 구조 함수 People(const People&)을 호출 하여 임시 대상 을 만들어 인쇄 한 것 입 니 다.h1 은 기본 구조 함수 People()을 호출 하여 인쇄 한 것 입 니 다.그렇다면 임시 대상 의 설립 을 어떻게 피 할 수 있 을 까?매우 간단 하 다.우 리 는 실 참 을 인용 하여 목적 을 달성 했다.
void swap(People&p1,People&p 2)세 번 째 상황 은 함수 가 대상 으로 돌아 갈 때 입 니 다.임시 대상 의 생 성 은 구조 함수 복 제 를 통 해 이 루어 진 것 임 을 주의해 야 한다.
예컨대   const Rationanl operator+(Rationanl a,Rationanl b)이 함수 의 반환 값 은 이름 이 붙 지 않 았 기 때문에 함수 의 반환 값 일 뿐 입 니 다.매번 add 구 조 를 호출 하고 이 대상 을 석방 하기 위해 대 가 를 치 러 야 합 니 다

 #include<iostream>
 class People
 {
     public:
         People(std::string n,int a)
         :name(n),age(a)
         {
             std::count<<"h2"<<std::endl;
         }
        People( )
        {
            std::count<<"h1"<<std::endl;
        }
        People(const People& P)
        {
            name=p.name;
            age=p.age;
            std::cout<<"h3"<<std::endl;
        }
        std::string name;
        int age;
};

void swap(People p1,People p2)
{
    People temp;
    temp.age=p1.age;
    temp.name=p1.name;
    p1.age=p2.age;
    p1.name=p2.name;
    p2.age=temp.age;
    p2.name=temp.name;
}

int main(int argc, char ** argv)
{
    People p1("tom",18),p2("sam",19);
    swap(p1,p2);
    return 0;
}

결 과 는:
4.567916.여기 서 안 타 깝 게 도 우리 가 생각 한 결 과 를 보지 못 했 습 니 다.결 과 는 h2,h2,h2,h3,h4 이 어야 합 니 다.값 을 되 돌 릴 때 할당 구조 함수 가 있 고 임시 변 수 를 만 들 었 을 것 입 니 다.나중에 필자 가 인터넷 에서 자 료 를 찾 아 GCC 가 최적화 되 었 음 을 확 인 했 습 니 다.

좋은 웹페이지 즐겨찾기