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

С++ идиомы - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Внедрение DLL в EXE http://www.cyberforum.ru/cpp/thread1787895.html
Здравствуйте, хочу написать свой объединитель exe и dll. Подскажите, как это можно сделать так, чтобы можно было при запуске использовать dll без записи на диск
C++ Как создать оконную программу на c++ exe Можно по подробние как создать оконную программу на c++ exe . Я только что перешол на c++ из Bash (cmd , bat , командная строка ) и как то не хочется опять возвращатся к консольным программам . Я незнаю еще не каких команд для C++ и не знаю не каких компеляторов но хотелось бы создать хотяюы самую простую оконную программу без всяких функций что бы просто открылось пустое окно . Вы поможите ? И... http://www.cyberforum.ru/cpp/thread1787737.html
Парсинг журнала событий C++
возникла задача, получить некоторые данные из event log'a Windows, как это все реализовать ? с чего начать?
Не выделяется память C++
Здравствуйте, пытаюсь выделить память, на одном компьютере работает, на другом нет, возвращает 0x00000000, хотя память имеется в наличии. В чём может быть причина? size_t size = 1586753967; void* b = malloc(size); free(b); Добавлено через 6 минут errno = ENOMEM, хотя памяти доступно 4,2 ГБ Добавлено через 2 минуты
C++ Стек и куча http://www.cyberforum.ru/cpp/thread1786739.html
Вот говорят, что для стека доступного места меньше, чем для кучи. И если есть много переменных большого размера, то лучше создавать их через new. а почему так?
C++ Программа для отправки сообщения Привет всем. Может кто помочь? Задача следующая. Есть сервер, к которому подключается 10 человек. На этом сервере лежат 10 именных папок (по имени участника). Когда кто-то один из участников перекидывает со своей папки второму участнику, то в это время второму участнику должно автоматически прийти сообщение на почту, что "в такое время, такой участник перекинул вам файл." Как можно сделать... подробнее

Показать сообщение отдельно
HelicopterK52
658 / 201 / 28
Регистрация: 27.07.2016
Сообщений: 475
Завершенные тесты: 1
01.08.2016, 20:51     С++ идиомы
Shrink-to-fit (уменьшить до размеров)

Задачи:
Уменьшить ёмкость (capacity) контейнера, до размера, достаточного для содержания элементов.

Также известен как
"Swap-To-Fit", введенный Скотом Майерсом в книге "Effective STL" ("Эффективное использование STL").

Мотивация:
Контейнеры в стандартной библиотеке часто выделяют памяти под большее число элементов, чем находится в контейнере.
Это позволяет оптимизировать расширение контейнера за счет более редких выделений памяти.
Но, когда контейнер уменьшается (или когда запас израсходаван не полностью, прим. переводчика), память так и остается занятой, хотя, фактически, она не используется. Это не нужный перерасход памяти. Данная (shrink-to-fit) идиома была разработана чтобы уменьшить расход до минимального требуемого контейнеру количества памяти, тем самым экономя ресурсы.

Решение и пример кода:
Данная идиома очень проста, как показано ниже.
C++
1
2
3
std::vector<int> v;
//v будет обменен с временной копией, которая оптимально использует запас памяти
std::vector<int>(v).swap(v);
Первая половина этой инструкции - std::vector<int>(v), создает временный вектор целых чисел, гарантируя, что выделенной памяти достаточно для хранения всех элементов вектора v, который передан в параметре. Также эти элементы копируются во временный вектор.
Вторая половина инструкции - .swap(v) обменивает элементы вектора v и временного вектора, используя не выбрасывающую исключений функцию-член swap, что является очень эффективным средством, которое сводится к обмену внутренних указателей между векторами или чуть более того.
После этого временный вектор удаляется, очищая память и удаляя элементы, которые первоначально находились в векторе v.
Вектор v же имеет ровно столько памяти, сколько нужно для хранения элементов.

ISO/IEC 14882:1998 не гарантирует такое поведение для конструктора копирования. Как гарантировать такое поведение?

Более надежным решением (в частности std::string и std::vector могут быть реализованы с использованием подсчета ссылок и тогда конструктор копирования может "скопировать" всю избыточную память) будет использование конструктора диапазонов, вместо конструктора копирования:
C++
1
2
3
std::vector<int> v;
//v будет обменен с временной копией, которая оптимально использует запас памяти
std::vector<int>(v.begin(), v.end()).swap(v);
Решение в C++11:
В C++11 некоторые контейнеры предоставляют функцию-член shrink_to_fit, например vector, deque, basic_string. shrink_to_fit запрашивает уменьшение capacity до size, Но данный запрос не является обязательным к исполнению.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru