가변 크기 배열이 포함 된이 C ++ 클래스는 동적 메모리 할당을 사용합니까?

StackOverflow https://stackoverflow.com/questions/554476

문제

이와 같은 작업을 수행하면 동적 메모리 할당이 사용됩니까?

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 연산자 (또는 그 적절한 버전).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top