Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с памятью в C/C++ 
:(
    Опции темы
djamshud
Дата 5.12.2009, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 1
Всего: 39



>обьявлять массив через маллок - это дольше

Дольше в плане написания лишнего десятка символов? Выполняется как раз пошустрее чуть-чуть;).

std::vector
http://www.sgi.com/tech/stl/Vector.html


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Курсант
Дата 5.12.2009, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 338
Регистрация: 21.2.2009
Где: Балашиха или Воро неж

Репутация: нет
Всего: 4



растягивать массивы насколько я знаю нельзя. Обычно объявляется новый массив, из старого в него копируются первые значения, старый массив удаляется и потом в новый массив уже дописываются новые значения... Вот... Возможно Вам стоит воспользоваться структурами типа одно- или двухсвязного списков, в которых есть указатель на предыдущий и последующий элемент... Такую цепочку можно наращивать, созданием новых объектов элементов списка и привязкой их к уже существующему списку с помощью полей - указателей....

Еще, кстати, элементом списка можно сделать не одно значение, а запись в которой будет место для 100 значений и т.п...

В конце, после того как все делители. будут найдены, можно объявить массив подходящего размера и весь список туда скопировать, а сам список удалить, т.к. с массивом работать возможно будет удобнее из Вашей программы...

Добавлено через 1 минуту и 33 секунды
набросок кода нужен? правда Си я недавно изучаю, и книги щас под рукой нет, но набросок будет правильного направления smile
PM ICQ Skype   Вверх
djamshud
Дата 5.12.2009, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 1
Всего: 39



>растягивать массивы насколько я знаю нельзя. Обычно объявляется новый массив, из старого в него копируются первые значения, старый массив удаляется и потом в новый массив уже дописываются новые значения... Вот...

Нет, нет и нет. Вы неправильно знаете. Malloc и иже с ним.

Вероятно вы изучаете с++, не называйте его си. Это совсем разные вещи:).


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
mr.Anderson
Дата 5.12.2009, 02:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



Цитата
Вероятно вы изучаете с++, не называйте его си

Цитата
Обычно объявляется новый массив, из старого в него копируются первые значения, старый массив удаляется и потом в новый массив уже дописываются новые значения

Вот как раз ЭТО проделывается в сях за неимением других методов (тот самый malloc и иже с ними). Есть, конечно, функции изменения размера, но, сколько мне помнится, они работают только с одномерными массивами. А вот в С++ - там да, там уже реализованы шаблоны классов для нормальных изменяющихся массивов. Для С++ применять можно и нужно вектор в данном случае. А для сей вариантов немного - malloc предпочтительнее. Не смешивайте два языка.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
djamshud
Дата 5.12.2009, 15:54 (ссылка)   | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 1
Всего: 39



>Вот как раз ЭТО проделывается в сях

Вот это как раз проделывается в плюсах за неимением функций изменения размера массива. В плюсах new и delete. И единственный способ изменить этот буфер - создать новый больший (или меньший), скопировать данные и удалить прежний. Сами плюсовые векторы реализуются именно на alloc'ах. Учите матчасть!

Цитата(man pages)

malloc() allocates size bytes and returns a pointer to the  allocated  memory.
free() frees the memory space pointed to by ptr.
realloc() changes the size of the memory block pointed to by ptr to size bytes.


>Для С++ применять можно и нужно вектор в данном случае.

Правильно. Только если в задаче не стоит условие использовать "традиционный" массив int*.

>Не смешивайте два языка.

В самом с++ нет механизмов эффективной работы с памятью, поэтому "смешивать два языка" - нередко единственный способ написания эффективного кода.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
W4FhLF
Дата 5.12.2009, 16:35 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 2
Всего: 121



Цитата(djamshud @  5.12.2009,  15:54 Найти цитируемый пост)
В самом с++ нет механизмов эффективной работы с памятью, поэтому "смешивать два языка" - нередко единственный способ написания эффективного кода.


Я так не думаю. realloc тоже будет перемещать элементы, если места под новый размер не хватит. А вектор мало того, что рабоает с памятью блочно, т.е. выделяет заранее больше, чем требуется, так ещё и имеет метод reserve. Эффективность долдна достигаться за счёт минимизации операций выделения/удаления. Для этого существуют различные техники, та же блочная работа с памятью в stl простейшая из них или хорошая методика описана у Александреску "Размещение в памяти небольших объектов", реализация естьв его библиотеке Loki. Для отдельных случаев существует паттерны, например Flyweight pattern (реализация есть в boost'e). 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
mes
Дата 5.12.2009, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 1
Всего: 250



Цитата(W4FhLF @  5.12.2009,  15:35 Найти цитируемый пост)

Я так не думаю. realloc тоже будет перемещать элементы, если места под новый размер не хватит. А вектор мало того, что рабоает с памятью блочно, т.е. выделяет заранее больше, чем требуется, так ещё и имеет метод reserve. 

А если заранее размер массива неизвестен и не хочется лишний переаллокаций, то можно вначале запихать в стек-очередь, а после, если необходим быстрый произвольный доступ, один раз переместить все в вектор. 
 smile 

Цитата(djamshud @  5.12.2009,  14:54 Найти цитируемый пост)
В самом с++ нет механизмов эффективной работы с памятью, поэтому "смешивать два языка" - нередко единственный способ написания эффективного кода. 

имхо редко, чаще самый эффективный метод это правильно выбранный алгоритм.
 smile 


Это сообщение отредактировал(а) mes - 5.12.2009, 17:33


--------------------
PM MAIL WWW   Вверх
djamshud
Дата 5.12.2009, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 1
Всего: 39



>Я так не думаю. realloc тоже будет перемещать элементы, если места под новый размер не хватит.

Он будет перемещать не элементы, а кусок памяти. В сравнении с копированием элементов это просто реактивно. Справедливости ради замечу, что вектор сделает то же самое.

>А вектор мало того, что рабоает с памятью блочно, т.е. выделяет заранее больше, чем требуется, так ещё и имеет метод reserve.

А malloc'ом выделить сразу побольше религия не позволяет?

Поясняю для непонятливых, я говорил об отсутствии эффективной работы с памятью в с++, а не в библиотеках. Вектор STL - специфичная приблуда, удобная в ряде случаев. Но в целом, все что умеет с++ - это new и delete([]), остальное - надязыковые фичи, пригодные в тех или иных ситуациях, внутрях реализованные чаще на си, чем на плюсах.

>чаще самый эффективный метод это правильно выбранный алгоритм

Естественно. Я подразумевал "при прочих равных".

>но как будет правильнее?

Так, как сказано в задании. Если в задании не оговаривается, правильнее в векторе или в chained-vector (хрен знает, как по-русски это правильно назвать, грубо говоря - список векторов. Есть ли он в STL, я не знаю).

Код
#include<vector>
#include<stdio.h>

int main() {
    std::vector<int> vector;
    for (int i=0;i<10;i++)
        vector.push_back(i+1+i*10);
    for (int i=0;i<vector.size();i++)
        printf("%d\n",vector[i]);
    return 0;
}



--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
W4FhLF
Дата 5.12.2009, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 2
Всего: 121



Цитата(djamshud @  5.12.2009,  21:33 Найти цитируемый пост)
Поясняю для непонятливых, я говорил об отсутствии эффективной работы с памятью в с++, а не в библиотеках. Вектор STL - специфичная приблуда, удобная в ряде случаев. Но в целом, все что умеет с++ - это new и delete([]), остальное - надязыковые фичи, пригодные в тех или иных ситуациях, внутрях реализованные чаще на си, чем на плюсах.


Какая разница? Речь о том, что эффективная работа с памятью должна организовываться на более высоком уровне, чем непосредственно allocation функции или оператор new. Как? Я уже пояснил выше. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
djamshud
Дата 5.12.2009, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 1
Всего: 39



Цитата(djamshud)
Эффективная работа с памятью должна начинаться на нижнем уровне и заканчиваться на среднем. На высоком на само понятие "память" можно начхать.

Невнимательно прочитал твое сообщение.

>Какая разница? Речь о том, что эффективная работа с памятью должна организовываться на более высоком уровне, чем непосредственно allocation функции или оператор new. Как? Я уже пояснил выше. 

Чувак, я тебе про одно, а ты про другое. Говорить очевидные вещи, когда сказать больше нечего, необязательно. С++ не предоставляет методов для _эффективной_работаты_с_памятью_. Отчасти или полностью потому, что это не его задача. В STL такая работа ведется в рамках задач, которые решает STL, не более. Спор окончен.

Это сообщение отредактировал(а) djamshud - 5.12.2009, 22:32


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
mes
Дата 5.12.2009, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 1
Всего: 250



Цитата(djamshud @  5.12.2009,  20:33 Найти цитируемый пост)
Справедливости ради замечу, что вектор сделает то же самое.

 дополню, что вектор (и другие стандартные контейнтеры)  выберет максимально эффективный подходящий для хранимого типа. Что из этого следует думаю понятно без объяснения. smile

Цитата(djamshud @  5.12.2009,  20:33 Найти цитируемый пост)
Поясняю для непонятливых, я говорил об отсутствии эффективной работы с памятью в с++, а не в библиотеках.

c++ рассматривать отдельно от стл мягко сказать неэтично.. Потому что подходящую типобезопасную и эффективную стратегию реализовывать средствами языка с точки зрения с++ не логично.
 smile 

Цитата(djamshud @  5.12.2009,  20:33 Найти цитируемый пост)
Естественно. Я подразумевал "при прочих равных".

Да естественно, но не очевидно.. особенно для новичков, и тех кого во время не поправили.  smile 

Цитата(djamshud @  5.12.2009,  20:33 Найти цитируемый пост)
chained-vector

имеется ввиду страничная тактика ? стл очереди именно ее и реализуют.

Цитата(djamshud @  5.12.2009,  21:03 Найти цитируемый пост)
С++ не предоставляет методов для _эффективной_работаты_с_памятью_. Отчасти или полностью потому, что это не его задача

добавлю, что в цитате подразумевается эффективная_работа_с_памятью_для_плоских_типов , ну а  С++ просто глядит гораздо шире smile



--------------------
PM MAIL WWW   Вверх
djamshud
Дата 5.12.2009, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 1
Всего: 39



>имеется ввиду страничная тактика ? стл очереди именно ее и реализуют.

Имеется ввиду подобие списка векторов. Компромисс между компактностью и скоростью вектора и фрагментированностью списка. Обычные вектора в т.ч. стл имеют совместимость с традиционными массивами с/с++, поэтому хранятся линейно.

>c++ рассматривать отдельно от стл мягко сказать неэтично..

Я не отрывал плюсы от стл, наоборот я всегда упоминал ее. Смотрите цитируемый абзац до конца;).

>добавлю, что в цитате подразумевается эффективная_работа_с_памятью_для_плоских_типов

Поправлю. В цитате подразумевается эффективная_работа_с_памятью_вообще_без_привязки_к_типам, т.е. о блоках памяти как таковых.

Добавлено через 1 минуту и 43 секунды
bsa, есть мнение, что это просто опечатка;).


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
mes
Дата 6.12.2009, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 1
Всего: 250



Цитата(djamshud @  5.12.2009,  22:18 Найти цитируемый пост)
Имеется ввиду подобие списка векторов.

ну да, очереди так и устроены smile

Цитата(djamshud @  5.12.2009,  22:18 Найти цитируемый пост)
Обычные вектора

вектора бывают необычными ? smile Не вектороми единым сыт стл smile  скоро еще контейнеров  добавят smile






--------------------
PM MAIL WWW   Вверх
mes
Дата 6.12.2009, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 1
Всего: 250



Цитата(djamshud @  5.12.2009,  22:18 Найти цитируемый пост)
Я не отрывал плюсы от стл, наоборот я всегда упоминал ее. Смотрите цитируемый абзац до конца;).

как раз и посмотрел :

Цитата(djamshud @  5.12.2009,  20:33 Найти цитируемый пост)
я говорил об отсутствии эффективной работы с памятью в с++, а не в библиотеках.

имелось ввиду тогда в сторонних библиотеках ? потому как стл - это библиотека.

Цитата(djamshud @  5.12.2009,  20:33 Найти цитируемый пост)
Вектор STL - специфичная приблуда, удобная в ряде случаев. 

стл это не только вектор.

Цитата(djamshud @  5.12.2009,  20:33 Найти цитируемый пост)
 остальное - надязыковые фичи, пригодные в тех или иных ситуациях, внутрях реализованные чаще на си, чем на плюсах.

Вы в этом уверены ? советую взглянуть на реализацию хотя бы Вашего любимого вектора - никакого си. И самое главное что вектор это не просто оболочка,
А интелектуальная оболочка реализующая наиболее эффективные методы работы с памятью (раз мы о ней говорим), насколько позволяет  тип хранимых объектов. 
при всем вся дополнительная  работа по выбору эффективности происходит на стадии компиляции и не нагружая этими проблемами программиста,
позволяя ему менять тип, незаботясь о том что где то ниже вылерзут боком несовместимые операции .
 smile 
Цитата(djamshud @  5.12.2009,  20:33 Найти цитируемый пост)
Но в целом, все что умеет с++ - это new и delete([]) [/B]

да в сам каркас языка не включены высокоуровневые абстракции, как в других языках, однако он позволяет написать библиотеку этих абстракций, что дает большую свободу,
и при этом одна из таких библиотек входит в состав языка - никаких ущемлений прав как у других smile

Это сообщение отредактировал(а) mes - 6.12.2009, 01:19


--------------------
PM MAIL WWW   Вверх
djamshud
Дата 6.12.2009, 02:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 1
Всего: 39



>как раз и посмотрел

До конца _абзаца_;). Там про стл, который безусловно вектором не един, просто прицепился, зараза такая.

>имелось ввиду тогда в сторонних библиотеках ? потому как стл - это библиотека.
Цитата(djamshud)

Поясняю для непонятливых, я говорил об отсутствии эффективной работы с памятью в с++, а не в библиотеках.

Тут я, признаю, немного оговорился, но если не отрывать фразу от общего контекста разговора, все станет понятно. Язык не предоставляет _механизма_эффективной_работы_. Ни сам, ни стлем. А внутри (в т.ч. стл) все в меру эффективно.

>Вы в этом уверены ? советую взглянуть на реализацию хотя бы Вашего любимого вектора - никакого си.

Ни чуточку не любимый, просто сабжевый и прицепившийся). Посмотрел. Обнаружил, что используется алокатор. Посмотрел аллокатор - плюсовая оболочка над malloc/realloc/free.

>А интелектуальная оболочка реализующая наиболее эффективные методы работы с памятью (раз мы о ней говорим), насколько позволяет  тип хранимых объектов.

Звучит очень красиво. Беглый осмотр не дал подтверждения вашим словам. Можете ткнуть носом, где именно это происходит?

>стл это не только вектор.

Да. Вместо "вектор" можно подставить любую стлеву структуру данных, истинность предложения сохранится. Стл весь из себя набор специфичных приблуд.

>да в сам каркас языка не включены высокоуровневые абстракции, как в других языках,

Да нет. В него включены абстракции new и delete. Но нету ни возможности изменить размер блока, ни скопировать, ни переместить его. Вообще в рамках ООП new и delete смотрятся очень хорошо: создать и удалить объект. Но вот приделали к new зачем-то функцию создания массивов... И тут же еще один костыль - черезжопный (синтаксисом) delete[]. Т.е. массив можно создать и уничтожить. Прям как объект. Вот только массив это ни разу не объект, и с ним хочется делать несколько больше. Количество вопросов (не здесь, на винграде, а вообще. А может и здесь много) "как изменить размер массива в с++" как бы намекает на это.

>однако он позволяет написать библиотеку этих абстракций, что дает большую свободу,

За что я его и люблю.

Добавлено через 11 минут и 35 секунд
Metalex, используйте вектор. Он как раз то, что вам нужно. Пример я где-то выше привел, для ваших целей он в самый раз: добавить и взять. Другие функции вроде как не нужны?..


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила ведения Религиозных войн
Smartov
1. Уважайте собеседника
2. Собеседник != враг
3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez"

С уважением, Smartov.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Религиозные войны | Следующая тема »


 




[ Время генерации скрипта: 0.1085 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.