![]() |
Модераторы: Daevaorn Страницы: (14) Все « Первая ... 9 10 [11] 12 13 ... Последняя »
( Перейти к первому непрочитанному сообщению ) |
![]() ![]() ![]() |
|
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Внимание! Хвост темы с базаром про ООП\не ООП перенесен в религиозные войны. Ругайтесь там, если охота. А здесь прошу высказываться по теме, если есть что сказать. Все прочее будет удаляться без предупреждения.
-------------------- ... |
|||
|
||||
Randajad |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 15.3.2012 Репутация: 8 Всего: 8 |
Очень интересное мнение участников про malloc.
А что участники думают по поводу этого? std::vector для классов, которые внутри себя выделяют память не подходит, потому что вектор все время переконструирует и вызывает оператор=(), когда закончилось место в буффере/удаляют элемент из середины массива; это все дико тормозит. Кстати. Еще в правила: не нужно использовать NULL. Это макрос и он задефайнен где-то там. Лучше 0. Или, с выходом С++0х можно еще nullptr. Это сообщение отредактировал(а) Randajad - 18.3.2012, 12:33 |
|||
|
||||
Фантом |
|
|||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: нет Всего: 49 |
||||
|
||||
Randajad |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 15.3.2012 Репутация: 8 Всего: 8 |
И что же вы находите такого плохого в дефайнах препроцессора?
![]() |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
А что тут думать? Вопрос находится в теме "как не надо писать код". Ответ очевиден.
![]() Самый быстрый доступ к элементам в векторе. Самое быстрое удаление/вставка в середину в списке. Если тебе не нужен случайный доступ, а достаточно последовательного, то лучше выбрать список. Если тебе необходим случайный доступ, а размер элементов не больше указателя, то быстрее вектора вряд ли что будет. Если ты используешь большие массивы больших элементов и случайный доступ необходим, то можно сделать нечто среднее, между списком и вектором. Т.е. в списке у тебя хранятся сами элементы, а в векторе хранятся указатели на них. Таким образом, при добавлении/удалении элементов, вектор будет работать только с простыми указателями (это быстро), а список с элементами. Пример такого контейнера - QList (Qt). |
|||
|
||||
Randajad |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 15.3.2012 Репутация: 8 Всего: 8 |
Это все хорошо, но необходим также доступ к элементам в стиле обычного массива.
![]() Так что увы, ничего подходящего не нашел, кроме как самописный вариант. |
|||
|
||||
bsa |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
|
||||
|
|||||
Randajad |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 15.3.2012 Репутация: 8 Всего: 8 |
Я имел ввиду чтобы:
array<int> arr; Было равно int arr[]; И все элементы стояли друг за другом в одном куске памяти. ![]() |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
если у объекта тривиальный конструктор/деструктор накладных немного. если нетривиальный, объект (или объекты с ним связанные) может быть обескуражен неожиданной сменой адреса. так что именно vector подходит "для классов, которые внутри себя выделяют память". память кстати по-разному выделять можно. скажем, копирование при записи. так что это скорее проблема класса-содержимого, а не контейнера. желание иметь элементы в памяти "одним куском", причем именно элементы, а не указатели законно, но не понятно. приведите пример, когда это действительно необходимо. мне в голову приходит только работа с низкоуровневыми библиотеками, но они в основном работают с элементарными типами данных, для которых перемещение в vector реализовано как раз через memmove. кстати. никто не мешает вам сделать свою специализацию класса vector. |
|||
|
||||
Randajad |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 15.3.2012 Репутация: 8 Всего: 8 |
Объекты внутри себя не хранят ссылок друг на друга, в этом вся фишка.
Выделение через new памяти для каждого объекта не хорошая идея потому, что размер объекта маленький, а их число порядка десятков тысяч. Таким образом из-за выравнивания и данных менеджера памяти получится слишком большое количество памяти "впустую". |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
|
|||
|
||||
heavix |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 10.8.2007 Репутация: нет Всего: нет |
10?)) Это еще ничего))) Вот сейчас у меня проект, в котором есть функция принимающая 43 параметра, причем одного типа mxArray... Корень всех бед проекта... И самое паршивое что я сделать ничего не могу, т.к эта функция дергается из длл-ки написанной в матлабе( А математику делаю не я... Вот и наступает вынос мозга когда человек делающий мат часть начинает требовать передачи параметров номер 3,9,12 как uint8, 14,16 как стринг... но все нуно конвертить в mxArray )) |
|||
|
||||
ТарасАтавин |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 370 Регистрация: 26.8.2013 Репутация: нет Всего: нет |
А почему так мало? Уж если автор идиот, то должна быть пара тысяч.
Добавлено @ 18:51
Добавлено @ 18:59 Как раз единственно допустимое. Маллок/реаалок - это для скаляров. Это сообщение отредактировал(а) ТарасАтавин - 29.8.2013, 19:09 -------------------- Не так всё плохо, как оно есть на самом деле. |
|||
|
||||
ТарасАтавин |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 370 Регистрация: 26.8.2013 Репутация: нет Всего: нет |
Самое веселое - это писать вообще без отсупов, а на плюсах так ещё и всё в одну строку.
Добавлено через 1 минуту и 11 секунд Вот ещё пособие, как делать не надо:
Добавлено через 4 минуты и 1 секунду И поминавшийся здесь явный вызов конструктора. Конструктор и деструктор придуманы именно для того, чтоб вызываться автоматически, чтоб уж точно не забыть из вызвать и, наоборот, не забыть, что уже вызвал. -------------------- Не так всё плохо, как оно есть на самом деле. |
|||
|
||||
ТарасАтавин |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 370 Регистрация: 26.8.2013 Репутация: нет Всего: нет |
Рекурсия бывает оправдана при обработке рекурсивных данных, например, деревьев. Но рекурсия на пустом месте - это именно то, чего делать не надо.
-------------------- Не так всё плохо, как оно есть на самом деле. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |