Использует ли этот класс 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++.

Размер массива известен во время компиляции, поэтому нет, здесь не будет использоваться динамическое распределение памяти.Если вы объявите массив в области функции, он будет помещен в стек, как и любой другой тип объекта.

Когда вы таким образом определяете объекты переменного размера, на самом деле происходит то, что компилятор создает определение класса «по заказу».Вы просто будете использовать определение класса, содержащее «T m_data[32]».

1. Шаблоны оцениваются только во время компиляции.Таким образом, этот массив будет иметь размер 32.

2. Вы не можете создать массив в стеке, используя переменную, это должна быть константа, которую можно вычислить во время компиляции, иначе вы можете использовать new (или malloc)

Динамическое выделение памяти обычно происходит при вызове new оператор (или один из его друзей).При этом выделяется часть памяти из резерва памяти, обычно называемого кучей.Помните, что в отличие от статического выделения, компилятор не заботится об освобождении памяти, поэтому вам придется делать это вручную, используя команду delete оператор (или его подходящая версия).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top