2013-03-20 2 views
2

Я строю тип данных BigInt, который использует массив беззнаковых коротких сообщений. В некоторых функциях короткий номер самого высокого порядка может использоваться или не использоваться, но всегда распределяется на всякий случай. Для того, чтобы предотвратить бесконечное потребление памяти из основных математических операций, я хотел бы просто перераспределить массив таким образом:Когда realloc сжимает выделенный блок, где свободна память?

toReturn.numArray = realloc(toReturn.numArray, (sizeof(unsigned short)) * (toReturn.numElements - 1)) 

, но я не знаю, если высшие биты порядка будут free'd (идеал) или низкие биты заказа.

+0

У вас действительно есть мегабайты размером в мегабайт? В противном случае сокращение вряд ли понадобится. – kay

+0

Предназначен для принудительного форсирования RSA (для его изучения) и для сложных операций с файлами, которые трудно выполнять другими способами. Но это не мегабайты, это около 64 экзабайт ... – Josh

+0

@teppic Вот что я рассчитываю ... – Josh

ответ

1

Если блок памяти перемещен, данные будут скопированы со дна старого буфера, до нового размера.

Если вы хотите сохранить верхнюю часть своих данных, вам нужно будет сделать malloc/memmove или аналогичный.

Как это относится к вашим битам, зависит от того, как вы сопоставляете свои данные с блоком, я бы подумал. Это должно быть контролируемым.

+0

Определить нижнюю часть старого буфера? Я не совсем уверен, что это зависит от конца. – Josh

+0

Как у меня есть, индекс u16 массива 0 самый низкий, а индекс [размер] содержит наиболее значимые бит. – Josh

+0

@Josh - «нижняя часть старого буфера» = 'адрес памяти, который вы указали 'malloc', и что вы перешли в' realloc'' –

3

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

C99 Стандарт 7.20.3.4-1: перераспределить функции:

Функция перераспределить освобождает старый объект, на который указывает PTR и возвращает указатель на новый объект, который имеет размер Специфическое изд по размеру. Содержимое нового объекта должно быть таким же, как и у старого объекта до освобождения, вплоть до меньшего размера нового и старого размеров. Любые байты нового объекта за пределами размера старого объекта имеют неопределенные значения.

+0

Это не мой вопрос.Я не полагаюсь на один и тот же блок памяти, мне интересно, что можно ожидать в старом блоке в новом блоке, учитывая, что новый блок меньше. – Josh

+0

@Josh: Вызывает ли вышеуказанная цитата это также? Это довольно ясно и явно указано в цитате. Все они. –

+0

Непонятно. Неявная информация, в которой теряются байты, не находится в этом. Я все-таки понял. Я был глупым. – Josh

1

от 'человека перераспределить()'

The realloc() function changes the size of the block pointed 
to by ptr to size bytes and returns a pointer to the (possi- 
bly moved) block. The contents will be unchanged up to the 
lesser of the new and old sizes. 
+0

да, но какие байты сохранены? – Josh

+0

«без изменений до меньшего ..», поэтому левые байты сохраняются. т.е. сжимают ("123456789 \ 0" до 4); будет «1234» с нулевым или без него. То же самое для ints и shorts –

+0

Удерживайте .... так в массиве, индекс 0 до? потеряны? – Josh

0

Хорошо, я был тупой-тупой.

array = realloc (array, lessSizeNumber);

сохраняет массив [0] в массив [smallSizeNumber - 1].

Биты верхнего порядка теряются.

+0

* «Содержимое нового объекта должно быть таким же, как и у старого объекта до освобождения, вплоть до меньшего размера нового и старого размера». * Как это цитирует, не отвечает на ваш вопрос? –

Смежные вопросы