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

Выделение памяти для буффера, под std::istream& operator>>(std::istream &, String &) - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Нужно вынести часть программы в отдельный модуль http://www.cyberforum.ru/cpp-beginners/thread887500.html
Помогите вынести 19-36 строки в отдельный модуль, чтобы можно было потом как заголовочный файл .h его подключить #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <fstream> #include <map> using namespace std; int main() {
C++ Однозвязный список через template Помогите разобрать код в тех местах где я поставил //???? . Код не мой, и указатели я не очень хорошо понимаю. #include <iostream> using namespace std; /////////////////////////////////////////// template <class T> struct element { element* next; http://www.cyberforum.ru/cpp-beginners/thread887472.html
Классы: составить описание объектного типа Matrix (инициализации единичной, квадратных матриц, сложение, транспонирование, вычисление определителя) C++
Составить описание объектного типа Matrix, обеспечивающего инициализации единичной матрицы, квадратных матриц, сложение матриц, транспонирование, вычисление определителя матрицы.
C++ Получить строку, в которой наибольшее число знаков препинания
Дан текстовый файл. Получить строку, в которой наибольшее число знаков препинания.
C++ Подключение статической библиотеки (libxls) http://www.cyberforum.ru/cpp-beginners/thread887465.html
Здравствуйте, недавно столкнулся с необходимостью читать из .xls файла, нашел для этого библиотеку libxls. В их readme написано, что они "A multiplatform, C/C++ library for parsing Excel(TM) files." (то есть я так понял что в винду в проект с плюсами это запихнуть можно), однако в архиве с названием "Win32 binary: libxls-0.2.0-win32.tar.gz" (судя по всему для винды?) лежат хедеры и файл .a,...
C++ где моду прочитать о деревьях с нуля? где моду прочитать о деревьях с нуля? подробнее

Показать сообщение отдельно
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
02.06.2013, 01:36     Выделение памяти для буффера, под std::istream& operator>>(std::istream &, String &)
Цитата Сообщение от xtorne21st Посмотреть сообщение
Хотя с другой стороны постоянное выделения новой памяти и перекопирование старого значения в новую память также расходная операция и ко всему прочему реализация при помощи malloc/realloc - проще.
realloc() тоже будет копировать память, если у него закончится свободное место сразу же за расширяемым куском.

Как это делается правильно:
1. String всегда выделяет память с запасом.
2. Читаем символ из потока в следующую ячейку буфера.
3. Если символы в потоке закончились, то выходим.
4. Если нет, и буфер ещё не закончился, то goto 2.
5. Если символы так и прут, а буфера уже нет, то
5.1. Выделяем в K раз больше памяти, чем есть сейчас.
5.2. Копируем/перемещаем туда всё, что есть сейчас.
5.3. Освобождаем ненужную старую память.
5.4. goto 2.

Константу K обычно берут в районе 1,5 — 2 или применяют более хитрую стратегию роста.
 
Текущее время: 06:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru