![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SizeOf для массивов более 32к [D7, XP]
Alex_C © (2008-01-21 15:40:00)Есть массив
Buffer : ^TByteArray;
...
GetMem( Buffer, 36000 );
Если потом сделать
SizeOf(Buffer^), то рез-т получается не 36000, а 32768. А как получить реальный размер буффера?
Alex_C (2008-01-21 16:40:00) [1]Спасибо всем!
Свою ошибку понял. Перешел на динамический массив.
homm (2008-01-21 16:16:00) [2]> [3] han_malign © (21.01.08 16:08)
> то реальный размер буфера ты "получаешь" в момент выделения
> памяти и его храние целиком твоя обязанность...
Не совсем так. По смещению -4 от начала выделеного блока, кажется, лежит размер блока.
> Можно получить выделенный размер буфера (округленный с точностью
> 4-байта)
Видимо мы об одном и том же. Только я ничего не помню, про кртность читырем.
han_malign (2008-01-21 16:08:00) [3]SizeOf - это константа вычисляемая на этапе компиляции - в данном случае SizeOf(Buffer^) идентично SizeOf(TByteArray).
Если не хочешь пользоваться динамическими массивами, то реальный размер буфера ты "получаешь" в момент выделения памяти и его храние целиком твоя обязанность...
Можно получить выделенный размер буфера (округленный с точностью 4-байта) зная особенности реализации Borland менеджера памяти, но это есть нехорошо - т.к. не гарантируются совместимость с новыми версиями компилятора, и должна быть уверенность что указатель указывает строго на начало выделенного блока...
Можно пользоваться кучей Windows, которая поддерживает проверку целостности - HeapAlloc/HeapFree/ HeapSize/HeapXXX - но это извращение т.к. менеджер памяти Borland намного эффективнее.
Leonid Troyanovsky (2008-01-21 15:47:00) [4]
> Alex_C (21.01.08 15:40)
> А как получить реальный размер буффера?
Он и есть реальный:
TByteArray = array[0..32767] of Byte;
--
Regards, LVT.
Юрий Зотов (2008-01-21 15:44:00) [5]Что такое у Вас TByteArray? Если динамический массив, то выкиньте все указатели и GetMem'ы. Динамический массив сам по себе - уже указатель, а память под него выделяется через SetLength.