PROGRAMMING

객체, 임시 객체 본문

프로그래밍 언어 공통

객체, 임시 객체

Raccoon2125 2020. 10. 24. 17:27

임시 객체

: 실행 도중에 잠깐만 사용되는 객체. 사용자도 모르게 이름도 없이 사용되는 객체

  소스 코드에도 없는 힙 이외의 공간에 생성되는 것이 임시객체이다.

  임시 객체는 코드 수행을 위해 컴파일러가 만들어내는 임시적 객체로, 반드시 임치 객체의 생성과 소멸이라는 비용이 따른다.

  임시 객체는 statement의 끝. 즉, EOS(end of statement)에서 소멸된다.

  ※ 자세한 내용 : scv.bu.edu/computation/bluegene/IBMdocs/compiler/xlc-8.0/html/language/ref/cplr382.htm

 

Temporary objects (C++ only)

Temporary objects (C++ only) Temporary objects are unnamed objects created on the stack by the compiler. They are used during reference initialization and during evaluation of expressions including standard type conversions, argument passing, function retu

scv.bu.edu

  하지만, 임시 객체는 사용자가 사용할 수 있다. 예를 들어, 일반적 객체의 경우 가지는 역할이 매우 작아 한 번만 호출된다고 했을 때, 이 객체는 메인함수 종료 시까지 유지되므로 효율이 떨어지게 된다. 그럴 때, 일반적 객체를 임시 객체형태로 호출하면 한 번 호출된 이후 바로 소멸되므로 프로그램 성능이 좋아진다. (람다함수의 사용 이유와 일맥상통)

 

함수 객체

: STL의 많은 알고리즘이 함수 객체를 즐겨 사용을 하기 때문에 더더욱 알아야 하며 이게 과연 특징이라고 볼 수 있냐는 의견도 있지만, 분명 STL 알고리즘에서는 함수 객체를 많이 사용하기 때문에, 적어도 알아야 할 개념이다.
  먼저 STL에서 정의하는 함수 객체 타입에 대해 이해를 해야하는데, STL에서는 함수 객체를 세가지 타입으로 분류를 하는데, 이들 각각에 다른 이름을 사용한다.
  foo() 함수처럼 인자 없이 호출되는 함수객체는 발생자(Generator) 라고 부르고
  foo(x) 처럼 하나의 인자를 받는 것을 단항 함수 (Unary Function) 이라고 부른다.
  foo(x,y)처럼 두 개의 인자를 받는 것을 이항 함수 (Binary Function) 이라고 부른다.
  인자의 개수와는 별도로 bool 값을 반환하는 파라미터가 함수 포인터나 함수 객체라면 술어 (Predicate) 라고 부른다.
  단항 함수가 불 값을 반환하는 경우는 단항 술어 (Unary Predicate) 또는 술어 (Predicate) 라는 이름으로 부르고, 이항 함수가 불 값을 반환하는경우엔 이상 술어 (Binary Predicate) 라고 부른다.
  세개 이상은 STL에서 존재하지 않기 때문에 그런말은 사용하지 않는다.
  우리가 알아야 할 것은 단항 술어 (Unary Predicate) 와 이항 술어 (Binary Predicate) 이 두가지 경우만 알아두면 된다.

 

※ (예시) 단항함수 객체를 받는 C++ algorithm count_if 함수의 구현 예시 <출처> cppreference.com

template <class InputIt, class UnaryPredicate>
typename iterator_traits<InputIt>::difference_type count_if(InputIt first,
                                                            InputIt last,
                                                            UnaryPredicate p) {
  typename iterator_traits<InputIt>::difference_type ret = 0;
  for (; first != last; ++first) {
    if (p(*first)) {
      ret++;
    }
  }
  return ret;
}

 

'프로그래밍 언어 공통' 카테고리의 다른 글

해쉬(Hash)  (0) 2020.11.01
환경 변수  (0) 2020.11.01
람다(lambda) 함수  (0) 2020.10.24
포인터, 레퍼런스, 함수 포인터  (0) 2020.10.24
Value Category  (0) 2020.10.24
Comments