[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 |