Será que esta classe C ++ que contém uma alocação de memória uso dinâmico matriz de tamanho variável?

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

Pergunta

Does fazendo algo como essa alocação uso de memória dinâmica?

template <class T, int _size> 
class CArray 
{ 
public:
    ... 
private:
    T m_data[_size]; 
};

Alguém pode me explicar o que está acontecendo nos bastidores quando eu criar o objeto?

CArray<SomeObject, 32> myStupidArray;
Foi útil?

Solução

Como mencionado em outras respostas, os modelos são avaliadas em tempo de compilação. Se você estiver interessado você pode ter g ++ cuspir a hierarquia de classes, onde pode verificar seu tamanho:

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;
}

Compilar com -fdump-class-hierarchy:

g++ -fdump-class-hierarchy blah.cc

Deve haver um arquivo chamado blah.cc.t01.class no diretório atual:

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

Outras dicas

n, que será atribuída no local (por exemplo, quer na pilha, ou como parte de um objecto que contém).

Com os modelos os parâmetros são avaliados em tempo de compilação para que o seu código se torna eficaz;

class CArray 
{ 
public:
    ... 
private:
    SomeObject m_data[32]; 
};

Modelos são avaliadas em tempo de compilação, então m_Data [_size] é compilado como m_Data [32].

Não, ele não usa alocação dinâmica de memória. O compilador sabe quanto precisa de memória a ser alocada, é decidido em tempo de compilação, não em tempo de execução.

Não faz qualquer sentido para explicar modelos C ++ aqui, eles são explicados muito bem em outras páginas, como na C ++ FAQ Lite .

O tamanho da matriz é conhecido em tempo de compilação, de modo nenhum, não vai estar usando alocação dinâmica de memória aqui. Se você declarar a matriz em um escopo de função, então ele vai ser colocado na pilha como qualquer outro tipo de objeto.

Quando você define objetos de tamanho variável como este, o que realmente está acontecendo é que o compilador está construindo uma definição de classe 'à ordem'. Você só vai estar usando uma definição de classe que contém 'T m_Data [32]' nele.

1- Os modelos são avaliados apenas em tempo de compilação. Então essa matriz será de tamanho 32

2 Você não pode criar uma matriz na pilha usando uma variável, deve ser uma constante que pode ser avaliada em tempo de compilação, então você pode usar novo (ou malloc)

alocação de memória dinâmica geralmente ocorre quando você chamar o operador new (ou um de seus amigos). Isso aloca um bloco de memória de uma reserva de memória comumente referido como um montão. Lembre-se que ao contrário de alocação estática, o compilador não cuidar de livre-ing a memória e então você tem que fazê-lo manualmente usando o operador delete (ou uma versão adequada do mesmo).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top