Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Максимальное использование оперативной памяти


Автор: Trishi 12.5.2007, 00:14
Как расчитать размерность массива n*n, чтобы максимально использовать оперативную память в Borland С++?

Автор: JackYF 12.5.2007, 01:44
Гм... Ну если это дело Borland C++ 3.1, то тогда оперативки у тебя около 640 Кб... квадратный корень из этого дела - 800. Итого - 600-750, я бы посоветовал. Это если массив char. Если int - тогда 300-375.

Если Borland C++ 5.5 и выше, то тогда берешь 80% от размеры оперативки, и делаешь те же самые вычисления.

Автор: Anikmar 12.5.2007, 02:01
ИМХО.
Думаю при Windows реальный размер именно оперативки, выделенной под конкретную задачу, узнать будет проблематично.
Можно узнать ее общий объем, объем виртуалки, а вот, что именно оперативка выделена - это врядли.

Автор: nerezus 12.5.2007, 08:08
Цитата

то тогда оперативки у тебя около 640 Кб... 
 64 кило, т.к. размер указателя 16бит )
итого 250х250 примерно для char, т.к. немного под другие переменные надо оставить.

Автор: MAKCim 12.5.2007, 11:11
Anikmar, 
SEH + сканирование пользовательского адресного пространства
0x00000000 - 0x7FFFFFFF (3:1)
или
0x00000000 - 0xBFFFFFFF (2:2)
Код

unsigned long ptr = 0, memory = 0;
unsigned char value;
for (; ptr < 0x80000000; ptr += PAGE_SIZE) {
    __try {
        value = *(unsigned char*)ptr; /* try to generate #PF */
        memory += PAGE_SIZE;
    } __except(EXCEPTION_ACCESS_VIOLATION) {}
}

 smile 

Автор: W4FhLF 12.5.2007, 11:14
Цитата(MAKCim @  12.5.2007,  11:11 Найти цитируемый пост)
0x00000000


0x00010000 я полагаю smile

Автор: MAKCim 12.5.2007, 11:23
W4FhLF, 
да без разницы, я особо не в курсе распределения ресурсов в пользовательском адресном пространстве
M$ Window$, если она что-то резервирует для нулевых адресов, то да, для увеличения производительности можно отсечь заранее невалидные адреса

Автор: Trishi 12.5.2007, 16:19
Цитата(JackYF @ 12.5.2007,  01:44)
Ну если это дело Borland C++ 3.1, то тогда оперативки у тебя около 640 Кб...

Откуда вы взяли, что именно 640 Кб? Это не зависит от размера моей оперативы в компе? smile 


Цитата(nerezus @ 12.5.2007,  08:08)

 64 кило, т.к. размер указателя 16бит

Если честно, невижу связи между размером оперативной памяти и размером указателя smile Поясните пожалуйста

Автор: MAKCim 12.5.2007, 17:03
Цитата(Trishi @  12.5.2007,  16:19 Найти цитируемый пост)
Откуда вы взяли, что именно 640 Кб? Это не зависит от размера моей оперативы в компе?

не зависит, задача будет выполняться в виртуальном режиме с эмуляцией 1Mb памяти, причем валидным будет только диапозон
0x00000 - 0x9FFFF, что и есть 640Kb
0xA0000 - 0xBFFFF - VGA буфер
0xC0000 - 0xDFFFF - extended area
0xE0000 - 0xFFFFF - BIOS

Автор: Trishi 13.5.2007, 18:07
Цитата(JackYF @ 12.5.2007,  01:44)
Если int - тогда 300-375.

А я считала - у меня получилось где-то n=570 для int. Я сначала в байты перевела - получила 655360 байт. Потом на 2 делила потому что в int 2 байта. А потом корень брала. А как у вас получилось такое число?

А программе именно в С вообще больше n=180 пишет, что массив слишком велик

Автор: JackYF 14.5.2007, 02:58
Цитата(Trishi @  13.5.2007,  18:07 Найти цитируемый пост)
Потом на 2 делила потому что в int 2 байта.

Тьфу блин... это же дос-режим... тут int 2 байта, а не 4. Пардон, тогда конечно - порядка 500-600.



Цитата(Trishi @  13.5.2007,  18:07 Найти цитируемый пост)
А программе именно в С вообще больше n=180 пишет, что массив слишком велик

А это еще от компилятора зависит и от настроек виртуального режима. Но раз пишет - значит, ему доступно...
всего лишь около 180х180 х2 = 64800 байт.

Похоже, что в данном случае прав был nezerus. Хотя я тонкостей 16-битного режима не знаю.

Автор: dizzy1984 14.5.2007, 06:46
Будет даже меньше 640кб, т.к bc++3.1 не умеер работать с указателями больше 64кб.
Поскольку его арифметика указателей не рассчитана на модификацию сегментной части.
Поэтому самое удобное - char arr[65536 - 4]

Можно, впрочем, сделать собственную обработку операций -- и ++, благо 
char far *arr  = (char far *)farmalloc(65536l * 8) сделает ожидаемое.
И компилировать программу лучше непосредственно из дос, т.к борландовская ide занимает 
1-ну или 2-е страницы памяти.

Автор: dumb 14.5.2007, 09:35
Цитата(dizzy1984 @  14.5.2007,  06:46 Найти цитируемый пост)
т.к борландовская ide занимает 
1-ну или 2-е страницы памяти.

это сколько в граммах? и что есть страница в досе? smile

Цитата(dizzy1984 @  14.5.2007,  06:46 Найти цитируемый пост)
компилировать программу лучше непосредственно из дос

не совсем понял, какая связь между занимаемой ide памятью и процессом компиляции?

Автор: dizzy1984 14.5.2007, 16:22
Цитата(dumb @  14.5.2007,  09:35 Найти цитируемый пост)
это сколько в граммах?

Сейчас нигде не могу найти но насколько помню в реальном режиме величина, кратная 16 байт - параграф, 65536 - страница. 

Цитата(dumb @  14.5.2007,  09:35 Найти цитируемый пост)
не совсем понял, какая связь между занимаемой ide памятью и процессом компиляции?

Никакой я просто описАлся, не компилировать, а запускать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)