С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
satisfactor
0 / 0 / 0
Регистрация: 11.01.2010
Сообщений: 51
#1

Корректно ли будет работать функция realloc в пользовательском классе массива - C++

19.07.2014, 15:45. Просмотров 349. Ответов 7
Метки нет (Все метки)

Доброго времени суток.
Корректно ли будет работать функция realloc в пользовательском классе массива, если в этом массиве предполагается хранение объектов класса, например, triangle, который был унаследован от shape? Если нет, то каким образом лучше всего выполнять перераспределение памяти при увеличении/уменьшении размера массива, не уходя далеко от эффективности realloc?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.07.2014, 15:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Корректно ли будет работать функция realloc в пользовательском классе массива (C++):

Насколько корректно будет работать замыкание? - C++
Мой друг-JS'ер бросил мне очередной челлендж. В этот раз он мне предложил сделать замыкание для a*x+y function line(k,b){ return...

Функция для заполнения массива в указанном пользовательском диапазоне - C++
Доброе время суток! Ребята на вечер контрольная, подскажите как реализовать такое приложение! Благодарен за ранее!!! Создать...

Error C2040 в пользовательском классе - C++
Функция main: int main( void ) { const char str = "message"; String( str ); std::cin.get(); std::cin.get(); return 0; } ...

Неправильная работа сложения в пользовательском классе - C++
Вечер добрый. Написал свой класс Money. Решил протестировать, и наткнулся на ошибку. #include <iostream> #include "Money.h" using...

Почему не срабатывает конструктор копирования в пользовательском классе - C++
вроде со всем разобралась, но не заходит в конструктор копирования. В чём ошибка? #include <iostream> #include "welcome.h" ...

Перегрузка оператора operator+() в пользовательском классе (сложение строк) - C++
Хотел научить класс складывать строки, но на моменте освобождения памяти temp происходит ошибка. Поля класса: char* Str, int length...

7
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.07.2014, 15:52 #2
Цитата Сообщение от satisfactor Посмотреть сообщение
каким образом лучше всего выполнять перераспределение памяти при увеличении/уменьшении размера массива, не уходя далеко от эффективности realloc?
при увеличении создавать новый массив большего размера, копировать туда старый, старый удалять.
да и вообще лучше заранее создавать массив большего размера чтоб не проделывать перераспределение при каждой вставке элемента.
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
19.07.2014, 16:16 #3
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
realloc выполнит побитовое копирование данных. Т.о. если например в каком-то объекте был указатель на другой объект, который тоже был перемещен - получите битый указатель.
Пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
 
struct S
{
    int data;
    S* pair;
    
    void print() const
    {
        std::cout << "data:" << data << " pair data:" << pair->data << std::endl;
    }
};
 
 
int main() {
    
    S* s = static_cast<S*>( malloc(sizeof(S)*2) );
    
    void* p = malloc(100);
    *static_cast<int*>(p) = 100500;
 
    s[0].data = 1;
    s[1].data = 2;
    s[0].pair = &s[1];
    s[1].pair = &s[0];
    
    s[0].print();
    s[1].print();
    
    S* news = static_cast<S*>( realloc( s, sizeof(S)*3 ) );
    if( news )
    {
        std::cout << s << " : " << news << std::endl;
        s = news;
    }
    
    std::cout << "after realloc\n";
    
    s[0].print();
    s[1].print();
    
    return 0;
}
http://ideone.com/5nLv1B

Добавлено через 1 минуту
Цитата Сообщение от satisfactor Посмотреть сообщение
не уходя далеко от эффективности realloc?
Об оптимизации позаботитесь когда (и если) настанет для этого время.
1
salam
171 / 152 / 16
Регистрация: 10.07.2012
Сообщений: 751
20.07.2014, 09:57 #4
вроде давно устоялась схема (используемая видимо в std::vector):
поддерживаем массив некоторого размера http://www.cyberforum.ru/cgi-bin/latex.cgi?size. как только заполняется ячейка с номером http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{size}{2} + 1 выделяем новую память под массив размером http://www.cyberforum.ru/cgi-bin/latex.cgi?size * 2 и копируем туда старый.
если массив может сокращаться. в момент когда освободилась ячейка с номером http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{size}{4} перевыделяем память под поддерживаемый массив (перевыделенный блок должен быть, конечно, размером http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{size}{2}) и копируем туда.
для этой схемы нетрудно доказывается учетная оценка http://www.cyberforum.ru/cgi-bin/latex.cgi?\mathcal{O(1)} на операции вставки в конец и удаления из конца.
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
20.07.2014, 10:23 #5
salam, известные реализации так себя не ведут. Особенно в плане уменьшения размера. Сжатие выделенной памяти возможно только при ручном вызове shrink_to_fit или например при копировании в новый вектор.
1
salam
171 / 152 / 16
Регистрация: 10.07.2012
Сообщений: 751
20.07.2014, 13:44 #6
Tulosba, спасибо. все-таки так себя не ведет std::vector или все вариации, которые вам известны? не очевидно, почему они так поступают (в смысле удаления).
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
20.07.2014, 13:57 #7
Цитата Сообщение от salam Посмотреть сообщение
или все вариации,
все вариации чего?

Добавлено через 1 минуту
Цитата Сообщение от salam Посмотреть сообщение
не очевидно, почему они так поступают (в смысле удаления).
Вероятно потому что приоритет отдан скорости, а не памяти.
0
salam
171 / 152 / 16
Регистрация: 10.07.2012
Сообщений: 751
20.07.2014, 14:22 #8
Tulosba, вариации того, что все понимают под динамическим массивом.
0
20.07.2014, 14:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.07.2014, 14:22
Привет! Вот еще темы с ответами:

Реализовать в пользовательском классе дружественную функцию согласно условию - C++
Помогите пожалуйста, много задач за день прорешал и эту уже не понимаю(( Дан класc. Добавьте дружественную функцию ИмяФункции(),...

Почему функция не будет работать без амперсанда? - C++
void swap(int &amp; ar1, int &amp; ar2) //функция обмена { int temp = ar1; ar1 = ar2; ar2 = temp; } почему функция НЕ будет...

Объясните, как будет работать функция поиска Числа Фибоначчи - C++
int fib(int x) { if (x &lt; 2) return 1; else return fib(x - 1) + fib(x - 2); } Объясните на пальцах, как будет работать...

Функция realloc - C++
Начнем сразу с кода. #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;cstdlib&gt; int main(void) { using namespace std; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.