C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

стр.: (3) < 1 2 [3] >
Оценивание качества кода
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
переменная удаляется, но указатель остаётся...


Вы уверенны ? Об этом где-то написано ? Скажите где пожалуйста, я просто не встречал и раньше не слышал sad.gif

ну указатель — это для проца и проги — как обычная переменная — с ней можно производить вычисления, присваивания, сравнения и т.д., единственное отличие — это операзия разыменования (*), при которой считуется ячейка с адресом, который хранится в указателе (и програмиста проблемы, чтоб не было 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)) ?



Я скажу, что это указатель не на простой тип wink.gif

А вообще, когда я вижу выделение массива в 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" (или ее видоизменениями). Так что не бойтесь использовать. smile.gif Хотя, язык гибкий — делайте как вам удобнее. Речь, изначально, шла об указателях и пример приводился для 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
}

выделяются разные ячейки, а разводит из по местам компилятор...
но такое лучше не применять, т.к. сами запутаетесь...
я вообще стараюсь все переменные объявить в начале функции — так проще искать smile.gif
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 праздниками (наступающими, наступившими, или прошедшими — кто когда будет читать :-) )
стр.: (3) < 1 2 [3] >
Вернуться в Вопросы программирования в C++Builder