Использует ли этот класс C ++, содержащий массив переменного размера, динамическое распределение памяти? - PullRequest
4 голосов
/ 16 февраля 2009

Использует ли что-то подобное динамическое распределение памяти?

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

Может кто-нибудь объяснить мне, что происходит за кулисами, когда я создаю объект?

CArray<SomeObject, 32> myStupidArray;

Ответы [ 7 ]

11 голосов
/ 16 февраля 2009

Нет, он будет размещен на месте (например, в стеке или как часть содержащего объекта).

С шаблонами параметры оцениваются во время компиляции, поэтому ваш код эффективно становится;

class CArray 
{ 
public:
    ... 
private:
    SomeObject m_data[32]; 
};
5 голосов
/ 17 февраля 2009

Как уже упоминалось в других ответах, шаблоны оцениваются во время компиляции. Если вам интересно, вы можете заставить 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
3 голосов
/ 16 февраля 2009

Шаблоны оцениваются во время компиляции, поэтому m_data [_size] компилируется как m_data [32].

1 голос
/ 16 февраля 2009

Нет, он не использует динамическое распределение памяти. Компилятор знает, сколько памяти нужно выделить, это определяется во время компиляции, а не во время выполнения.

Здесь нет смысла объяснять шаблоны C ++, они довольно хорошо объясняются на других страницах, как в C ++ faq lite .

0 голосов
/ 16 февраля 2009

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

0 голосов
/ 16 февраля 2009

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

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

0 голосов
/ 16 февраля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...