Форум программистов, компьютерный форум CyberForum.ru

Операторы динамического выделения памяти - new/delete - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Выделение памяти http://www.cyberforum.ru/cpp-beginners/thread264315.html
Не знаю как точно сформулировать вопрос. Где можно прочитать о принципах выделения, считывания, записи и распределения памяти в кэше, стэке, куче. Как раздаются адресса, про то что память выделяется блоками и почему именно такими(на слуху блоки по 8 байт и 64), скорость выделения(записи и считывания) и соответсвенно возможная оптимизация.
C++ Длинная арифметика Мне дали задание с вычеслениями длинной арифметики. С мысл в том что там все действия происходят с символьными масивами. Я так и не разобрался как это всё работает. Обьясните. http://www.cyberforum.ru/cpp-beginners/thread264314.html
C++ Построить абстрактный класс
Никак не успеваю с лабораторными, помогите пожалуйста. Построить абстрактный класс Locate, описывающий позицию на экране, и производные классы Figure и Text, описания некоторых фигуру и текст. Построить класс FiguraText производный от классов Figure и Text. Написать функции (методы) Show () и Move () для всех классов.
C++ C++/ Оператор for
1. Посчитать суму чисел от 100 до 200 которые кратные 17 2. Каждые 3 часа амёба надвое, посчитать сколько будет амёб будет через 120 часов
C++ Определить процедуры выполнения арифметических операций над комплексными числами http://www.cyberforum.ru/cpp-beginners/thread264275.html
Добрый день. Помогите пожалуйста решить задачу на си. Тема:Программирование задач с использованием нескольких функций на языке Си. Даны действительные числа u1, u2, v1, v2, w1, w2. Получить - комплексные числа u1 + iu2, v1 + iv2, w1 + iw2. (Определить процедуры выполнения арифметических операций над комплексными числами.)
C++ Cетевая игра "крестики-нолики" Помогите, на курсовой задали, сделать сетевую игру крестики-нолики в консоли, нужно сделать сервер и клиенты. Там необходимо создать библиотеки у меня уже почти все готовы только как все это собрать в рабочую программе, чтобы был сервер, и клиент не знаю, так как очень плохо в этом разбираюсь тем более сетевая игра. Ниже прилагаю полный текст задания. Вдруг кому уже давали подобное задание... подробнее

Показать сообщение отдельно
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
27.03.2011, 12:46     Операторы динамического выделения памяти - new/delete
Цитата Сообщение от Nameless One Посмотреть сообщение
Так что vector::resize все же нельзя считать аналогом realloc'a, если я вообще понял суть обсуждаемого вопроса.
realloc поступает так же. Если есть возможность добавить память в хвост, то он просто добавляет память (т.е. довыделяет только остаток), если возможности нет, то выделяет новую память полного размера и копирует в него данные из старого участка, после чего старый участок удаляется.

У всех контейнеров (а точнее, у всех шаблонов) есть параметр Allocator, который фактически является менеджером памяти. Этот менеджер памяти на низком уровне так или иначе работает с malloc/realloc. И вполне логично, что менеджер памяти должен всегда отъедать побольше памяти за раз, чтобы поменьше обращаться к malloc/realloc.

Да, по скорости это будет медленнее, чем работать напрямую с realloc'ом. Я сравнивал время работы calloc и вектора. Использовал именно calloc, потому что вектор не просто выделает память, но ещё и вызывает дефолтный конструктор для каждого элемента, что в случае с базовыми типами языка означает обнуление (т.е. calloc, а не malloc). Обнуление памяти в calloc'е скорее всего реализовано на ассемблере. Обнуление памяти в векторе - это цикл по всем элементам с записью нуля в каждый элемент (и как бы написан на языке Си++). И компилятор скорее всего сгенерил код, менее эффективный, чем внутри calloc'а

Вектор условно можно считать механизмом, которым можно пользоваться взамен malloc/realloc/free. Но это всё-таки объект языка, а потому для работы на низком уровне он менее удобен. Т.е. в случае malloc'а выделил указатель, записал куда-то и работай с ним, а в случае с вектором надо постоянно с собой таскать объект-вектор. Всё это решаемо, но может оказаться менее удобным, чем работа с указателем. Дополнительно при увеличении размера идёт зачастую ненужная работа по обнулению. Но в целом, с виду, можно заменять.

На коротком примере проверил максимально разрешённый размер для vector.resize - он совпал с ограничением по realloc'у

Цитата Сообщение от KBEPTMEH Посмотреть сообщение
Так же подчеркнул для себя ряд интересных нюансов в последующих сообщениях.
Всем большое спасибо
Спор, направленный в правильное русло, почти всегда заканчивается кучей полезной информации для прочих читателей

Цитата Сообщение от fasked Посмотреть сообщение
То есть realloc тоже выделяет заведомо больше памяти?
Любой менеджер памяти всегда выделяет заведомо больше памяти. Т.е. если ты будешь 100 раз довыделять по 1 байту, то обращаться 100 раз к Api системы получается слишком дорого. Куда дешевле выходит при первом обращении, например, выделить сразу 4 килобайта памяти, а при последующих 99 довыделениях просто поправить значение текущего размера массива. тот Allocator, который находится в параметре шаблона, можно переопределить на свой и реализовать свою собственную логику выделения памяти.

malloc внутри себя тоже выделяет сразу большой кусок памяти. Это низкоуровневая функция, а потому она умеет работать по конкретным значениям виртуальных адресов и выделяет память с точностью до границы страницы. Ибо аппаратный контроль за допустимой областью памяти делается именно с точностью до страницы
 
Текущее время: 00:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru