Сколько будет i++ + ++i?
Вопрос для собеседования на вакансию C/C++-программиста:
int i = 5, j = i++ + ++i; – чему равно i и j?
Ответ вида “За такое нужно руки отрывать”, не подходит, ибо автор вопроса считает, что знает правильный ответ — i=7, j=12. Но так ли это? Далее »
Автор: Vladimir, опубликовано в: C/C++, комментариев: 5Апр
2009
GCC: извращения с вращением
Неоднократно встречаю такие объявления в заголовочных файлах (это особенно характерно для всяких «домашних» криптографических библиотек):
{
#if defined(__GNUC__) && defined(__i386__)
__asm__("roll %%cl,%0" :"=r" (x) :"0" (x),"c" (shift));
return x;
#else
return (x < < shift) | (x >> (32 - shift));
#endif
}
Так вот: так делать не надо. Далее »
Автор: Vladimir, опубликовано в: C/C++, комментариев: 1Март
2009
Практическая польза fast-типов
В данной статье речь пойдёт о типах int_fastXX_t/uint_fastXX_t из stdint.h.
Мне было интересно потестировать параллельную реализацию шифрования алгоритмом ГОСТ 28147–89 на многоядерных процессорах (с использованием OpenMP, но это тема для отдельной статьи).
Как известно, ГОСТ 28147–89 — блочный шифр, оперирующий 64-битными (uint64_t) блоками. При выполнении зашифрования в режиме простой замены открытый текст разбивается на две половины (uint32_t). В принципе, это всё, что пока нужно знать
Те, кто знакомы с особенностями архитектур 32- и 64-битных процессоров, знают, что 32-битные процессоры быстрее обрабатывают 32-битные числа, а 64-битные — соответственно, 64-битные.
В стандарте C99 языка C в файле <stdint .h></stdint> определены так называемые "быстрые типы": int_fast8_t, int_fast16_t, int_fast32_t, int_fast64_t, uint_fast8_t, uint_fast16_t, uint_fast32_t и uint_fast64_t. Далее »
Март
2009
OpenMP: установка маски соответствия процессоров в Linux
Специалисты Intel рекомендуют задавать маску соответствия процессоров (известную как CPU affinity mask) для потоков OpenMP, чтобы привязать поток к определённому процессору (или ядру процессора, что в данном случае одно и то же). Как утверждается, это позволяет минимизировать миграцию потоков и снизить стоимость переключения контекста между процессорами.
Далее »
Март
2009
Почему важно использовать setsid()
Для того, чтобы процесс стал демоном, программисты используют вызов fork(), например, следующим образом:
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
pid_t pid = fork();
switch (pid) {
case 0:
// Child code — hello from the daemon
break;
case -1:
perror("fork");
exit(EXIT_FAILURE);
default:
exit(EXIT_SUCCESS);
}
Код рабочий, но с точки зрения безопасности не самый лучший. Далее »
Автор: Vladimir, опубликовано в: C/C++, Безопасность, комментариев: 1Март
2009


Меня зовут Владимир, я программист-фрилансер, специализирующийся на Web-программировании и програмировании под Linux.
По совместительству занимаюсь администрированием LAMP/LNMP-серверов и техническим переводом.





