alibek писал(а):Но обычно рекомендуется выносить одинаковые вычисления из цикла.
Ой.. Я посчитал память для
arrStr(x) = CStr(X) Uranium-238 писал(а):Очень загадочная строка .... нифига не понял
Количество строк из 1 цифры - 10 (9 и ещё нолик).
Количество строк из 2 цифр - 90.
...
Количество строк из 7 цифр - 9000000.
Количество строк из 8 цифр - 40000000 (так уж цикл кончился).
На каждый символ в строке тратится по 2 байта.
В сумме (1*10 + 2*90 + 3*900 + 4*9000 + 5*90000 + 6*900000 + 7*9000000 + 8*40000000) * 2 = 777777780 байт.
Сам массив: 8 байт на хранение длины и по 8 байт на ссылку на каждую строку. В сумме 8 + 50000000 * 8 = 400000008 байт.
Внутреннее представление каждой строки: 8 байт на ссылку на массив и 8 неучтённых байт на хранение длины. В сумме 50000000 * (8 +
= 800000000 байт.
Итого: 777777780 + 400000008 + 800000000 = 1977777788 байт.
Это самый минимум, который требуется, чтобы всё это хранить.
Uranium-238 писал(а):Но не в строке дело, как тогда заполнить массив рационально?
Эм.. Это и есть рационально. Там даже сборщику мусора ничего не достаётся - выделяется только та память, которую ты реально используешь.
Вероятно, рационально было бы не хранить числа в виде строк?
Uranium-238 писал(а):Одинаковые числа для примера!!! Код решил сократить до минимума.
Тогда пересчитываем формулу выше:
Каждая строка: 8 байт на ссылку на массив символов, 8 байт на длину, 8*2 байт на хранение самой строки, т. е. 32 байта на строку.
Массив по старой схеме 400000008 байт.
Итого: 32*50000000 + 400000008 = 2000000008 байт.
И я не учёл какой-нибудь завершающий 0, всякую информацию о типе объекта и т. д.