Статьи из рубрики «C/C++» RSS

Советы и программы на C/C++ для разных операционных систем.

Сколько будет i++ + ++i?

Вопрос для собеседования на вакансию C/C++-программиста:

int i = 5, j = i++ + ++i; – чему равно i и j?

Ответ вида “За такое нужно руки отрывать”, не подходит, ибо автор вопроса считает, что знает правильный ответ — i=7, j=12. Но так ли это? Далее »

Автор: Vladimir, опубликовано в: C/C++, комментариев: 5
13
Апр
2009

GCC: извращения с вращением

Неоднократно встречаю такие объявления в заголовочных файлах (это особенно характерно для всяких «домашних» криптографических библиотек):

[-]
View Code C
inline uint32_t rol(uint32_t x, uint8_t shift)
{
#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
22
Март
2009

Практическая польза fast-типов

В данной статье речь пойдёт о типах int_fastXX_t/uint_fastXX_t из stdint.h.

Мне было интересно потестировать параллельную реализацию шифрования алгоритмом ГОСТ 28147–89 на многоядерных процессорах (с использованием , но это тема для отдельной статьи).

Как известно, ГОСТ 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. Далее »

Автор: Vladimir, опубликовано в: C/C++, комментариев: 4
20
Март
2009

OpenMP: установка маски соответствия процессоров в Linux

Специалисты Intel рекомендуют задавать маску соответствия процессоров (известную как CPU affinity mask) для потоков , чтобы привязать поток к определённому процессору (или ядру процессора, что в данном случае одно и то же). Как утверждается, это позволяет минимизировать миграцию потоков и снизить стоимость переключения контекста между процессорами.
Далее »

Автор: Vladimir, опубликовано в: C/C++, Linux, OpenMP, комментариев: 4
16
Март
2009

Почему важно использовать setsid()

Для того, чтобы процесс стал демоном, программисты используют вызов fork(), например, следующим образом:

[-]
View Code C
chdir("/");
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
8
Март
2009