Asher |
Отправлено: 26.04.2005, 08:07 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
QUOTE | А что это действительно так . А где это написано ? Я не проверял . А то заставлю начальника ракошелиться а потом выяснится , что нельзя . А я потенциально и 4Gb могу запросить. |
Дж. Рихтер "Создание эффективных WIN32-приложений
с учетом специфики 64-разрядной версии Windows"
Часть III. Управление памятью.
Глава 13 Архитектура памяти в Windows
Вечером перечитал — был не совсем прав.
Есть там ключ /3GB к какой-то записи в системном файле Boot.ini.
С ним пользовательский процесс может получить 3 Гига, оставляя 1 Гиг операционке в версиях Windows 2000 Advanced Server и Windows 2000 Data Center для процессоров x86
(XP в книге нет, так-что как там на самом деле я не знаю. Да я и на W2k AdvServ не пробовал ни разу.)
|
|
Konstantine |
Отправлено: 26.04.2005, 08:16 |
|
Мастер участка
Группа: Модератор
Сообщений: 545
|
QUOTE (Sl@Sh @ 25/04/2005, 14:07) | QUOTE | переменная удаляется, но указатель остаётся... |
Вы уверенны ? Об этом где-то написано ? Скажите где пожалуйста, я просто не встречал и раньше не слышал |
ну указатель — это для проца и проги — как обычная переменная — с ней можно производить вычисления, присваивания, сравнения и т.д., единственное отличие — это операзия разыменования (*), при которой считуется ячейка с адресом, который хранится в указателе (и програмиста проблемы, чтоб не было Access Denied)
так вот теперь скажите — если от обычной переменной (не динамическая) память при выходе из функции не освобождается, то с какой радости она будет освобождаться из-под указателя???
|
|
*Treumer |
Отправлено: 26.04.2005, 11:56 |
|
Не зарегистрирован
|
QUOTE (vitavita @ 25/04/2005, 18:56) | Мне приходится использовать указатели. пример:
QUOTE | class Vox
{private: // User declarations
unsigned char *V;
public: // User declarations
Vox(int,int,int);
}
Vox::Vox(int i,int j , int k ){//возможные значения i=j=k= 1000;
int Count= i*j*k;
unsigned char *V=new unsigned char [Count];
} |
Т. е. памяти надо за 1 Gb
Вы скажете что можно использовать
vector< vector< vector< unsigned char>>> V (i, vector< vector< unsigned char>>(j,vector< unsigned char>(k)) ?
|
Я скажу, что это указатель не на простой тип
А вообще, когда я вижу выделение массива в 1 Гб, закрадывается сомнение, а правильно ли решается задача, нет ли более экономных путей её решения...
|
|
vvoid |
Отправлено: 26.04.2005, 15:15 |
|
Машинист паровоза
Группа: Участник
Сообщений: 171
|
QUOTE | А то заставлю начальника ракошелиться а потом выяснится , что нельзя . А я потенциально и 4Gb могу запросить. |
Так проверь не надо иметь 1 ГБ ОП, чтобы выделить гиг под переменную, тут то и прелести виртуальной памяти! И её под каждый процесс и выделяется по 4 гига. (из этих 4х гигов один или два отводится операционке). Так что размер ОП — не определяющее значение. Другое дело быстродействие! Когда все данные в оперативке — это одно, а когда ось постоянно лезет на винт... ну вообщем сами понимаете! Кстати Вин ХР Про по моему как-то умеет адресовать огромные размеры оперативы (как это сделать с точки зрения архитектуры проца я понимаю, но вот используют ли это в винде)
Кстати только что проверил! У меня 128 MB ОП, выделил память под массив (Builder5) размером 256 MB. Выделилось! И причём если в дебаге посмотреть на эту память, то она заполнена 0x00, по крайней мере начало (сами понимаете, 256 метров смотреть ;-) ). Попробовал записать значение в начало массива и в конец. ДОЛГО!
Попробовал бы выделить и побольше, да только места на системном диске не хватает — винда уже пищит: "почисти место, почисти место". Если кто попробует — напишите результаты!
|
|
Sl@Sh |
Отправлено: 26.04.2005, 15:42 |
|
Мастер участка
Группа: Участник
Сообщений: 383
|
QUOTE (Konstantine @ 26/04/2005, 08:16) | так вот теперь скажите — если от обычной переменной (не динамическая) память при выходе из функции не освобождается, то с какой радости она будет освобождаться из-под указателя??? |
Хотябы с той, что тут используется операция delete, которая и удаляет указатель. Вот например в книжке Г.Шилдта ничего не говорится о том, что указатель не удаляется, а наоборот пишут с помощью new и delete можно динамически создать и удалить указатель.
Исходя из прочитанного в книге, я и был удивлён вашему ответу. По этому и спросил об источнике инф.
|
|
Asher |
Отправлено: 26.04.2005, 16:09 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
C помощью new и delete создается и уничтожается не указатель, а объект (читай массив инициалиированных байт), на который указывает указатель.
Иначе как проинициализировать указатель до операции New и потом обнулить указатель, после уничтожения объекта, на который он указывал?
|
|
Guest |
Отправлено: 26.04.2005, 16:11 |
|
Не зарегистрирован
|
QUOTE |
Хотябы с той, что тут используется операция delete, которая и удаляет указатель. Вот например в книжке Г.Шилдта ничего не говорится о том, что указатель не удаляется, а наоборот пишут с помощью new и delete можно динамически создать и удалить указатель.
|
То есть по вашему такой код нерабочий?
CODE |
char *cp = new char[...];
delete cp[];
cp = "aaa";
ShowMessage(cp);
|
Удаляется указуемый объект а не указатель.
|
|
vvoid |
Отправлено: 26.04.2005, 17:30 |
|
Машинист паровоза
Группа: Участник
Сообщений: 171
|
По-моему, строки так лучше не присваивать!
А вообще, если в результате cp = "aaa"; в cp занесётся указатель на строку "ааа", то этот код может и отработает.
Но мне такой метод определённо не нравится! (то ли у меня такой метод присваивания строк когдато обломался, то ли ещё что-то)
|
|
Guest |
Отправлено: 26.04.2005, 20:27 |
|
Не зарегистрирован
|
]QUOTE | А вообще, когда я вижу выделение массива в 1 Гб, закрадывается сомнение, а правильно ли решается задача, нет ли более экономных путей её решения... |
QUOTE | Так что размер ОП — не определяющее значение. Другое дело быстродействие! Когда все данные в оперативке — это одно, а когда ось постоянно лезет на винт... ну вообщем сами понимаете!
|
В том то и дело что нужно быстродействие. И в оперативке-то тоже для меня плохо — хочу процессор раз в 100 побыстрее. Вобщем задача касается пространства — воксели . И тут нужно и быстро и много. Конечно можно сжимать — но теряешь время. А его тоже мало. В общем Крей надо |
|
vitavita |
Отправлено: 26.04.2005, 20:29 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 59
|
Предедущее сообщение мое — забыл войти |
|
AVC |
Отправлено: 28.04.2005, 09:28 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
2vvoid
QUOTE |
А вообще, если в результате cp = "aaa"; в cp занесётся указатель на строку "ааа", то этот код может и отработает
|
А если написать так
char *cp = "aaa";
то вас это перестанет смущать?
А теперь разобъем этот кусок на два
char *cp;
cp = "aaa"; |
|
vvoid |
Отправлено: 28.04.2005, 15:01 |
|
Машинист паровоза
Группа: Участник
Сообщений: 171
|
Вообще-то, не перестанет. Я уже писал своё мнение по поводу инициализации во время объявления. Оно конечно не сильно совпадает с идеологией С++, но и обоснования тоже есть!
Инициализацию использую только для создания строковых констант и вот таким образом
CODE |
static char HelloWorldStr[] = "Hello world!";
|
Но спасибо, за ответ — я понял, что компилятор нормально относится к такого рода записям. (хотя всё равно буду использовать strcpy ;-) )
|
|
avc* |
Отправлено: 28.04.2005, 15:58 |
|
Не зарегистрирован
|
Вообщето любой учебник, в том числе и Страуструп просто кишит записями типа char* street = "South Street" (или ее видоизменениями). Так что не бойтесь использовать. Хотя, язык гибкий — делайте как вам удобнее. Речь, изначально, шла об указателях и пример приводился для Sl@Sh, высказавшего некое предположение. |
|
Sl@Sh |
Отправлено: 28.04.2005, 16:09 |
|
Мастер участка
Группа: Участник
Сообщений: 383
|
Извиняюсь перед всеми, что постоянно задаю вопросы. Хотя это может быть полезно и не только мне.
Вот ещё хотелось бы узнать, куда деваются переменные объявленные в цикле for, после его завершения ?
|
|
vvoid |
Отправлено: 28.04.2005, 16:38 |
|
Машинист паровоза
Группа: Участник
Сообщений: 171
|
Я думаю туда же, куда и любые локальные переменные (а вот куда они деваются — никогда не задумывался).
Для переменный надо различать два понятия: область видимости и время жизни. Область видимости ограничивается скобками {}. Время жизни по умолчанию тоже. Можно увеличивать время жизни модификатором static.
Хотя есть возможности расширения области видимости (вроде бы оператор :: ), но им я не пользовался, так что будет интересно узнать что-нить интересное. :-)
|
|
Konstantine |
Отправлено: 28.04.2005, 17:00 |
|
Мастер участка
Группа: Модератор
Сообщений: 545
|
если попробовать использовать переменную, объявленную внутри блока {}, за его пределами то ВАС не пропустит компилятор...
а с "временем жизни" ячеек... пока всё было проще и не было возможности рекурсии, то все ячейки создавались при запуске программы... а с учётом возможностей рекурсии — наверно память для всех, переменных, используемых в функции, выделяется в момент вызова функции и удаляется при выходе.
заметте — ФУНКЦИИ, а не БЛОКА
причём для варианта:
CODE | {int a;
a=5;
// тут а=5
{int a;
a=3;
// тут а=3
}
// а тут снова а=5
} |
выделяются разные ячейки, а разводит из по местам компилятор...
но такое лучше не применять, т.к. сами запутаетесь...
я вообще стараюсь все переменные объявить в начале функции — так проще искать
|
|
AVC |
Отправлено: 28.04.2005, 17:25 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
Небольшое уточнение тело функции можно считать блоком. На всякий случай: локальные переменные размещаются в стеке, при входе в функцию компилятор рассчитывает смещение указателя стека так, что бы разместились все переменные, в том числе и те, которые в блоке (побочный эффект — время выделения не зависит от числа локальных переменных). При входе в блок компилятор начинает использовать другие ячейки стека, за этим следит компилятор. Вообще блоком можно считать все, что заключено в фигурные скобки, в том числе и тело функции, тело цикла и т.д.
QUOTE |
я вообще стараюсь все переменные объявить в начале функции — так проще искать
|
Я то же, но это привычка от классического C
|
|
Sl@Sh |
Отправлено: 29.04.2005, 15:36 |
|
Мастер участка
Группа: Участник
Сообщений: 383
|
QUOTE | Я то же, но это привычка от классического C |
У меня от Pascal.
P.S.: Спасибо всем !
|
|
vvoid |
Отправлено: 29.04.2005, 20:04 |
|
Машинист паровоза
Группа: Участник
Сообщений: 171
|
Нашёл некоторую статейку в тему:
Советы по написанию хороших программ.
Посмотрите, может понравится ... или нет ... или кто захочет прокоментировать (сам напишу коментарий, но наверное после праздиков, когда приду на работу)!
PS* C праздниками (наступающими, наступившими, или прошедшими — кто когда будет читать :-) )
|
|