пятница, 18 февраля 2011 г.
const или static const?
Это обсуждение напомнило, что один из наших подпроектов, сделанный студенткой и содержащий внутри функций большие константные массивы насчитанных каким-то математическим ПО данных, компилировался минут эдак под тридцать, пока не догадались заменить там const на static const. Ибо генерировался код заполнения этих самых массивов этими самыми данными (не говоря уж о том, что потом исполнялся при каждом входе в функцию). Хотя казалось бы — ну зачем этот код, раз массивы константны (и зачем размещать их на стеке)?
пятница, 28 января 2011 г.
Конструктор преобразования и оператор присваивания
Есть конструктор преобразования:
Надо ли определять ещё и оператор присваивания? Такой:MyType(OtherType value);
Пожалуй, да. Без него, смотрим disassembly MS Visual Studio 2005 для Debug, при присвоении MyType-у OtherType-а есть вызов конструктора и отдельно присвоение двумя mov-ами, с ним - просто вызов оператора присваивания.MyType&operator=(OtherType value);
понедельник, 9 августа 2010 г.
Переезд с компьютера на компьютер и Windows-шифрование
Заканчиваю переезжать на новый компьютер — или, скорее, в новый системный блок. В процессе переезда (который занял больше времени, чем это изначально предполагалось) сделал два наблюдения, первое из которых забыл, а второе вот:
Windows-шифрование файлов — зло, ибо изменение атрибута Encrypt contents to secure data меняет дату модификации файла.
Понятно, что иногда это не важно, что есть ещё архиваторы и проч., но...
И, да, подсоединившись пользователем с тем же именем с другого компьютера, забрать или прочесть-поредактировать зашифрованные файлы я не могу.
Windows-шифрование файлов — зло, ибо изменение атрибута Encrypt contents to secure data меняет дату модификации файла.
Понятно, что иногда это не важно, что есть ещё архиваторы и проч., но...
И, да, подсоединившись пользователем с тем же именем с другого компьютера, забрать или прочесть-поредактировать зашифрованные файлы я не могу.
среда, 23 июня 2010 г.
Обработка ошибок и примеры в книжках по программированию
В обучающей и справочной литературе по программированию сплошь и рядом пишут примерно так:
Увы, это приводит к тому, что начинающие программисты не видят по ходу обучения ни одного достойного образца обработки ошибок в типовых случаях вызова тех или иных API и проч. Более того: из примеров, подобных вышеприведенному, они делают вывод о третьестепенности и незначительности таковой обработки и сплошь и рядом пишут код вообще без неё (последнее — наблюдение из личного опыта работы с начинающими программистами).
То есть, как правило, авторы опускают код обработки ошибок, — стремясь сделать цитируемый код короче, а «полезную логику» примера понятней для читателя.const int iWaitResult = ::WaitForSingleObject(g_hMutex, INFINITE);
switch (iWaitResult) {
case WAIT_OBJECT_0: // Всё OK
break;
case WAIT_ABANDONED: // Один из потоков завершился, так и не вызвав
// ReleaseMutex. Скорее всего, это говорит об
// ошибке в программе, поэтому ставим ASSERT.
// В release-версии игнорируем проблему.
ASSERT(false);
break;
default:
// Здесь должна быть обработка ошибки.
}
Увы, это приводит к тому, что начинающие программисты не видят по ходу обучения ни одного достойного образца обработки ошибок в типовых случаях вызова тех или иных API и проч. Более того: из примеров, подобных вышеприведенному, они делают вывод о третьестепенности и незначительности таковой обработки и сплошь и рядом пишут код вообще без неё (последнее — наблюдение из личного опыта работы с начинающими программистами).
среда, 26 мая 2010 г.
Подписаться на:
Сообщения (Atom)