пятница, 18 февраля 2011 г.

const или static const?

Это обсуждение напомнило, что один из наших подпроектов, сделанный студенткой и содержащий внутри функций большие константные массивы насчитанных каким-то математическим ПО данных, компилировался минут эдак под тридцать, пока не догадались заменить там const на static const. Ибо генерировался код заполнения этих самых массивов этими самыми данными (не говоря уж о том, что потом исполнялся при каждом входе в функцию). Хотя казалось бы — ну зачем этот код, раз массивы константны (и зачем размещать их на стеке)?

пятница, 28 января 2011 г.

Конструктор преобразования и оператор присваивания

Есть конструктор преобразования:
MyType(OtherType value);
Надо ли определять ещё и оператор присваивания? Такой:
MyType &operator=(OtherType value);
Пожалуй, да. Без него, смотрим disassembly MS Visual Studio 2005 для Debug, при присвоении MyType-у OtherType-а есть вызов конструктора и отдельно присвоение двумя mov-ами, с ним - просто вызов оператора присваивания.

понедельник, 9 августа 2010 г.

Переезд с компьютера на компьютер и Windows-шифрование

Заканчиваю переезжать на новый компьютер — или, скорее, в новый системный блок. В процессе переезда (который занял больше времени, чем это изначально предполагалось) сделал два наблюдения, первое из которых забыл, а второе вот:

Windows-шифрование файлов — зло, ибо изменение атрибута Encrypt contents to secure data меняет дату модификации файла.

Понятно, что иногда это не важно, что есть ещё архиваторы и проч., но...

И, да, подсоединившись пользователем с тем же именем с другого компьютера, забрать или прочесть-поредактировать зашифрованные файлы я не могу.

среда, 23 июня 2010 г.

Обработка ошибок и примеры в книжках по программированию

В обучающей и справочной литературе по программированию сплошь и рядом пишут примерно так:
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 г.

Начало

Чтобы комментировать и подписываться (в обоих смыслах). А там посмотрим.