Форум: "Основная";
Текущий архив: 2003.05.08;
Скачать: [xml.tar.bz2];
Внизvar size Найти похожие ветки
← →
_Igorek (2003-04-25 10:51) [40]Забыл дописать, что итерфейс должен предоставлять доступ к обьектам, на котрые ссылается текущий.
Anatoly Podgorestky (25.04.03 10:49)
Так при повторе рекурсию дальше закручивать нет смысла.
← →
evvcom (2003-04-25 11:17) [41]> _Igorek
Ну попробуй.
← →
Anatoly Podgorestky (2003-04-25 11:21) [42]Ну ну, посмотрю я на тебя, с повторами :-) Наполеон однако
← →
_Igorek (2003-04-25 11:38) [43]evvcom © (25.04.03 11:17)
Что там пробовать? И не мне ж надо.
← →
evvcom (2003-04-25 11:40) [44]> _Igorek
Не вижу реального смысла в таком, поэтому даже не возникало желания фантазировать.
← →
Anatoly Podgorestky (2003-04-25 11:41) [45]Это из той же оперы, как объем памяти занимаемой программй, что то показывает, но к действительности это отношения не имеет.
← →
Palladin (2003-04-25 11:58) [46]
> KSergey © (25.04.03 09:56)
ага... ищущий... только он сам не знал чего искал...
целая толпа постов и все в пустую, здесь тоже самое
кроме может того что от темы уже пошли уклонения.
← →
KSergey (2003-04-25 12:23) [47]Дак в этих "отклонениях" вся соль! Они позволяют показать проблему с другой стороны: с той, с которой ее вовсе нет или же она не решаема. Вот как.
← →
Anatoly Podgorestky (2003-04-25 12:25) [48]Все крутится вокруг размера, с отклонениями в увесилительную сторону
← →
race1 (2003-04-25 13:11) [49]Вопрос в следующем:
Есть переменная-запись, в полях которой есть динамические массивы переменных-записей, и динамические строки. Меня интересует размер, занимаемый этой переменной в памяти. Меня не интересует размер указателя этой переменной, а именно сколько данных в килобайтах в этой переменной хранится. Что бы было более наглядно, предлагаю код:
type
TSmallRec = record
str: Array of String;
end;
TBigRec = record
str: Array of String;
aSmallRec: Array of TSmallRec;
end;
var
BigRec: TBigRec;
i, j: Byte;
begin
SetLength ( BigRec.str, 100 );
for i := 0 to 99 do
aBigRec.str[i] := "Some dynamic text";
SetLength ( BigRec.aSmallRec, 100 );
for i := 0 to 99 do
begin
SetLength ( BigRec.aSmallRec[i].str, 100 );
for j := 0 to 99 do
BigRec.aSmallRec[i].str[j] := "Another some dynamic text";
end;
end;
Вот такая сложная структура. Что меня интересует - размер памяти, выделенной для переменной BigRec. Считаем вручную:
17 символов в каждом эл-те массива BigRec.str. Умножаем:
17 * 99 = 1683
25 символов в каждом эл-те массива BigRec.aSmallRec[i].str. Считаем:
25 * 99 = 2475
99 эл-ов массива BigRec.aSmallRec. Считаем:
99 * 2475 = 245025
Складываем:
1683 + 245025 = 246708
Вот это число ( 246708 ) я и хочу получить.
Вобщем уже понятно в каком направлении идти - проходится вручную по записи и складывать значения размеров массивов, строк и т.п. Короче, можно считать, что тема закрыта :) Просто первоначально я подумал, что одной строчечкой можно узнать эту цифру ( 246708 ), т.е. сколько для этой переменной выделено в памяти памяти.
Спасибо всем откликнувшимся :)
← →
Palladin (2003-04-25 13:23) [50]happy end
← →
KSergey (2003-04-25 13:26) [51]1 Рассчеты не верны. Даже если сойтись на желании посчитать сколько данных хранится в структуре (что вы и пытались сделать) то как минимум не учитываются различные служебные данные Delphi, необходимые дял всех этих хранений
2.Опять путанница с терминологией. Надо все же быть поаккуратнее с ней, ведь об этом вся ветка!
Так что в будущем все же аккуратнее с терминологией: размер переменной (указателя) не равен размеру полезных данных и уж тем более никак не равен тому объему памяти, который распределен системой для хранения всего этого безобразия (тут и служебные данные, и кусочность выделения памяти - никто ее с точностью до байта не выделяет и т.д.)
← →
Anatoly Podgoretsky (2003-04-25 17:51) [52]Ну здесь довольно простая структура в два уровня, ди и то чтоно не ужнаешь (KSergey © (25.04.03 13:26)), а посмотри на структуры типа TList или того хуже, структуры где элементами будут классы, содержащие другие классы и скажем так что бы усложнить еще и указатели типа PChar - это особо тяжелый случай, тут даже анализ повторов не поможет.
Пусть PChar1 = @Buf, PChar2 = @Buf+N
Если сложить размеры то получим почти удвоение, что и происходит при оценке занятой программой памяти, многократный подсчет размера одной и то же ДЛЛ и других взаимно используемых объектов ОС, со свопом еще интереснее, а логически это ни как не отличается от твоего вопроса.
В простейших случаях можешь примерно расчитать объем, но примерно.
← →
_Igorek (2003-04-25 18:23) [53]Удалено модератором
Примечание: По ошибке
← →
LEON (2003-04-25 19:40) [54]
>2 race1 © (25.04.03 13:11)
здесь ты ответил на свой же вопрос
> SetLength ( BigRec.str, 100 );
> for i := 0 to 99 do
> aBigRec.str[i] := "Some dynamic text";
> 17 символов в каждом эл-те массива BigRec.str. Умножаем:
> 17 * 99 = 1683
17 мы получаем по Length(Str);
а 100 по > SetLength ( BigRec.str, 100 ); надо запомнить куда -то, типа в переменную
и у тебя ошибка, 17 надо на 100, а не на 99 умножать,
SmallRecSize := a * Length(Str)
{a - та переменная, куда мы запомнили число 100}
теперь мы имеем размер всех строка в BigRec
аналогично для строк массива SmallRec
и размер BigRec равен кол-во smallrec в bigrec + размер массива в bigrec, определённый выше.
← →
_Igorek (2003-04-25 19:52) [55]_Igorek (25.04.03 18:23)
Удалено модератором
Примечание: По ошибке
По чьей ошибке? :-)))
Страницы: 1 2 вся ветка
Форум: "Основная";
Текущий архив: 2003.05.08;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.009 c