본문으로 바로가기

Object instantiation / Template / Reference

category 개발언어/c++ 2016. 6. 13. 01:00

[C++] Object instantiation / Template / Reference

C++ Code Sample

·         Object instantiation

·         Reference

·         Template

- Object instantiation

C++ Object instantiation 방법에는 사용 기간에 따라 다음과 같은 방법이 존재함. 메모리의 어느 공간에 할당되는 지가 다름. 보통 heap 할당되는 것들은 크고, 메모리에 오래 상주해야하는 것들. stack 할당되는 것들은 작고, 메모리에 잠깐 상주해야하는 것들이다. 하지만, C++에서 dynamic allocation 가능하면 피해야 하므로1 거의 무조건적으로 stack 할당하는 것을 권장.

// Allocation on heap space: lives long period
 
MyClass *objects = new MyClass();
delete objects;
 
// Allocation on stack space: lives short period
MyClass objects;

- Reference

Reference 일반적인 포인터를 넘겨받는 것보다 유용한 것들이 가능.

int a[] = {1, 2, 3};
int *ap = a; // a pointer, size is lost
int (&ar)[3] = a; // a reference to the array, size is not lost

- Template

·         Basic
Template
C++ type 시스템을 효과적으로 다루기 위해서 필요한 매크로 비슷한 primitive. Template으로 정의된 함수 혹은 클래스들은 type-independent하게 common behavior 표현할 있다.

template <class T> 
void array_init(T param)
{
  ...
}
 
int main()
{  
  int my_iarray[5];
  float my_farray[5];
  array_init (my_farray);
  array_init (my_iarray);
}
- 함수에 대한 Template 사용 예제 -
template <typename T>
class list{
  private:
    vector<T> bucket;
  public:
    void append();
    void remove();
    void isEmpty();
}
 
template <typename T>
void list<T>::append (T const& bucket){
  ...
}
- 클래스에 대한 Template 사용 예제 -

·         Explicitly passing parameters
CUDA
에서 cpp integration , template 통해서 parameter explicit하게 전달함. 이렇게 전달되는 parameter 컴파일 타임에 처리되기 때문에, macro 매우 유사한 . 하지만, 사용 범위가 template 정의한 함수에 한정되기 때문에 파라미터 간의 중복을 방지할 있음. ( 자세한 비교는 Discussion-[1] 참고)

template <int BLOCK_SIZE> 
void calc_array(int data[]) {
  int *block = new int(BLOCK_SIZE);
  for (int i=0; i < BLOCK_SIZE; i++)
    data[i]++;
}
 
int main()
{  
  int my_array[10]={0,};
  calc_array<5> (my_array);
}

·         Implicitly passing parameters (Reference 응용)
Array
사이즈가 reference 의해 compile time implicitly deduced.@ StackOverflow

template <class T, size_t N> 
void array_init(T (&parm)[N])
{
  for (int i=0; i < N; i++)
    parm[i] = 1;
}
 
int main()
{  
  int my_array[5];
  array_init (my_array);
}

- Discussion

·         Template vs Macro @ MSDN

·         Stack / Static / Heap @ StackOverflow

Footnotes

'개발언어 > c++' 카테고리의 다른 글

List Column 고정하기  (0) 2016.06.13
Cedit버디컨트롤  (0) 2016.06.13
Template 상속받는 UI클래스 구현  (0) 2016.06.13
switch case 에 문자열 사용하기  (0) 2016.06.13
웹에서 다운로드  (0) 2016.06.13