가변 크기 배열이 포함 된이 C ++ 클래스는 동적 메모리 할당을 사용합니까?
-
23-08-2019 - |
문제
이와 같은 작업을 수행하면 동적 메모리 할당이 사용됩니까?
template <class T, int _size>
class CArray
{
public:
...
private:
T m_data[_size];
};
누군가 내가 물체를 만들 때 무대 뒤에서 무슨 일이 일어나고 있는지 설명 할 수 있습니까?
CArray<SomeObject, 32> myStupidArray;
해결책
다른 답변에서 언급했듯이 템플릿은 컴파일 시간에 평가됩니다. 관심이 있으시면 G ++가 크기를 확인할 수있는 클래스 계층 구조를 뱉을 수 있습니다.
template <class T, int _size>
class CArray
{
public:
private:
T m_data[_size];
};
int main(int argc, char **argv) {
CArray<int, 32> myStupidArray1;
CArray<int, 8> myStupidArray2;
CArray<int, 64> myStupidArray3;
CArray<int, 1000> myStupidArray4;
}
컴파일 -fdump-class-hierarchy
:
g++ -fdump-class-hierarchy blah.cc
이름이 지정된 파일이 있어야합니다 blah.cc.t01.class
현재 디렉토리에서 :
Class CArray<int, 32>
size=128 align=4
base size=128 base align=4
CArray<int, 32> (0x40be0d80) 0
Class CArray<int, 8>
size=32 align=4
base size=32 base align=4
CArray<int, 8> (0x40be0e80) 0
Class CArray<int, 64>
size=256 align=4
base size=256 base align=4
CArray<int, 64> (0x40be0f80) 0
Class CArray<int, 1000>
size=4000 align=4
base size=4000 base align=4
CArray<int, 1000> (0x40be6000) 0
다른 팁
아니요, 그것은 내장 내에서 할당됩니다 (예 : 스택에 또는 포함 객체의 일부로).
템플릿을 사용하면 매개 변수가 컴파일 타임에 평가되므로 코드가 효과적으로됩니다.
class CArray
{
public:
...
private:
SomeObject m_data[32];
};
템플릿 컴파일 시간에 평가되므로 m_data [_size]는 m_data [32]로 컴파일됩니다.
아니요, 동적 메모리 할당을 사용하지 않습니다. 컴파일러는 할당해야 할 메모리의 양을 알고 있으며, 런타임이 아닌 컴파일 타임에 결정됩니다.
여기서 C ++ 템플릿을 설명하는 것은 의미가 없으며, 다른 페이지에서는 꽤 잘 설명됩니다. C ++ FAQ 라이트.
배열의 크기는 컴파일 시간에 알려져 있으므로 여기서는 동적 메모리 할당을 사용하지 않습니다. 함수 범위로 배열을 선언하면 다른 유형의 객체와 마찬가지로 스택에 놓입니다.
이와 같은 가변 크기의 객체를 정의 할 때 실제로 일어나는 일은 컴파일러가 '주문하기' '클래스 정의를 구축한다는 것입니다. 당신은 그 안에 't m_data [32]가 포함 된 클래스 정의를 사용하게됩니다.
1- 템플릿은 컴파일 시간에만 평가됩니다. 따라서이 배열의 크기는 32입니다
2- 변수를 사용하여 스택에 배열을 만들 수 없으므로 컴파일 시간에 평가할 수있는 상수 여야합니다. 그렇지 않으면 새 (또는 Malloc)를 사용할 수 있습니다.
동적 메모리 할당은 일반적으로 호출 할 때 발생합니다 new
운영자 (또는 친구 중 하나). 이것은 일반적으로 힙으로 지칭되는 메모리 예약에서 메모리 덩어리를 할당합니다. 정적 할당과 달리 컴파일러는 메모리를 자유롭게 처리하지 않으므로 delete
연산자 (또는 그 적절한 버전).