Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно
pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Начиная ещё с первых компьютеров разработали хитрую систему для передачи данных между блоками программы и для выделения памяти под собственные нужды блоков. ПРичём надо было сделать так, чтобы
Код: Выделить весь код
// каждый вызов func1 должен иметь собственную память для x
void func1(int z)
{
   int x = z;
   ...

   if (0<x) func1(x-1);
}
Делается это просто. Есть участок памяти, называемый "стек". Он и действует по принципу "последний зашёл, первый вышел". Есть специальный регистр процессора, содержит адрес дна стека (допустим SP). При входе в функцию ей даётся память от SP-n до SP, где n - количество байт, требуемых для функции и SP уменьшается на n. При возврате из функции SP обратно увеличивается на n.
Код: Выделить весь код
// древний компьютер (карта памяти в килобайтах):
// R - ПЗУ, P - код программы, S - стек (задом-наперёд), пробелы - свободная память
// 00k RRRRRRRR 16k PPP      SSS 32k
// свободная память постоянно уменьшается с ростом стека
сейчас сохранился тот же подход, с отличием, что страницы памяти стека могут и не быть загружены в физическую память и лежат в произвольном порядке. И ещё есть искусственное ограничение на размер стека. У меня в настройках проекта стояла цифра 1МБ. Более подробно о стеке можно прочитать в википедии.

template<typename T> class vector {...} - это шаблон C++ контейнера с упорядоченным расположением элементов в свободной памяти. Контейнер - не в том смысле, в каком употребляется в гуишных библиотеках, а для хранения одинаковых структур в памяти. В угловых скобках пишется класс, для которого (основные ограничения):
1. есть явный конструктор по умолчанию explicit T() и конструктор копирования T(const T&)
2. нет побочных эффектов при копировании
3. нет чистых вируальных функций
при раскрытии шаблона создаётся новый класс, который имеет такое хитрое имя vector<T>.

можно сделать через оператор new:
Код: Выделить весь код
int* mem_TempArray = new int[Position*Rasryad];
...
delete[] mem_TempArray;
но в случае исключения память освобождена не будет (а вектор всегда освобождает за собой память)
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:50, 08-01-2008 | #10