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

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

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

Как работать с динамической матрицей в классе? C++
C++ Не выходит корректно работать с fstream
У меня класс B в классе A, а в классе B рекурсивная функция переопределения оператора "()", как её вызвать, не создавая явно объект класса B? C++
C++ Функция realloc
C++ Насколько корректно будет работать замыкание?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.07.2014, 15:52     Корректно ли будет работать функция realloc в пользовательском классе массива #2
Цитата Сообщение от satisfactor Посмотреть сообщение
каким образом лучше всего выполнять перераспределение памяти при увеличении/уменьшении размера массива, не уходя далеко от эффективности realloc?
при увеличении создавать новый массив большего размера, копировать туда старый, старый удалять.
да и вообще лучше заранее создавать массив большего размера чтоб не проделывать перераспределение при каждой вставке элемента.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
19.07.2014, 16:16     Корректно ли будет работать функция realloc в пользовательском классе массива #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?
Об оптимизации позаботитесь когда (и если) настанет для этого время.
salam
157 / 138 / 11
Регистрация: 10.07.2012
Сообщений: 709
20.07.2014, 09:57     Корректно ли будет работать функция realloc в пользовательском классе массива #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)} на операции вставки в конец и удаления из конца.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
20.07.2014, 10:23     Корректно ли будет работать функция realloc в пользовательском классе массива #5
salam, известные реализации так себя не ведут. Особенно в плане уменьшения размера. Сжатие выделенной памяти возможно только при ручном вызове shrink_to_fit или например при копировании в новый вектор.
salam
157 / 138 / 11
Регистрация: 10.07.2012
Сообщений: 709
20.07.2014, 13:44     Корректно ли будет работать функция realloc в пользовательском классе массива #6
Tulosba, спасибо. все-таки так себя не ведет std::vector или все вариации, которые вам известны? не очевидно, почему они так поступают (в смысле удаления).
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
20.07.2014, 13:57     Корректно ли будет работать функция realloc в пользовательском классе массива #7
Цитата Сообщение от salam Посмотреть сообщение
или все вариации,
все вариации чего?

Добавлено через 1 минуту
Цитата Сообщение от salam Посмотреть сообщение
не очевидно, почему они так поступают (в смысле удаления).
Вероятно потому что приоритет отдан скорости, а не памяти.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.07.2014, 14:22     Корректно ли будет работать функция realloc в пользовательском классе массива
Еще ссылки по теме:

Объясните, как будет работать функция поиска Числа Фибоначчи C++
Error C2040 в пользовательском классе C++
C++ Функция realloc

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

Или воспользуйтесь поиском по форуму:
salam
157 / 138 / 11
Регистрация: 10.07.2012
Сообщений: 709
20.07.2014, 14:22     Корректно ли будет работать функция realloc в пользовательском классе массива #8
Tulosba, вариации того, что все понимают под динамическим массивом.
Yandex
Объявления
20.07.2014, 14:22     Корректно ли будет работать функция realloc в пользовательском классе массива
Ответ Создать тему
Опции темы

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