С++

О семантике C++ (продолжение)

Наши читатели подсказывают нам, что в рассмотренном ранее примере может быть алиасинг.

Действительно, если у нас такое вот:

class someShit{
        char *m_sBuffer;
        size_t m_iLimit;
        size_t m_iCounter;
};
то никто не может гарантировать, что где-то не написали:
 m_sBuffer = (char*)&m_iCounter;
И тогда даже в одном треде можно огрести полные штаны счастья.

Меняю объявление на такое:

class someShit{
        char m_sBuffer[10240];
        size_t m_iLimit;
        size_t m_iCounter;
};
И для интеловского компилятора получаю счастье, в данном примере в память лишний раз никто не лазит:
void someShit::try1()
{
        m_iCounter = 0;
        while (m_iCounter< m_iLimit && m_sBuffer[m_iCounter])
                m_iCounter++;
}
MSVC 2010 это, правда, не помогло. Так и ходит через память.

Исходный вопрос (как отключить) снимается, restrict/__restrict в помощь, ключи компиляции опять-же есть.

Смерть Кащея

Смерть Кащея в игле, игла в яйце, яйцо в утке, утка в зайце, заяц в шоке!

Все-таки общедоступность работающих контейнеров в STL (и не только в STL) - это зло. И добро, конечно, тоже, ибо можно левой ногой делать действительно сложные структуры данных, но результат временами доставляет.

Не хочу (сначала хотел, потом передумал) разбирать конкретный код, просто замечу, что возможность сделать список указателей на "слово с атрибутами", причем "слово с атрибутами" - содержит список основ с флагами, а каждая основа - это std::string - это отличная возможность.

Я бы такую сложную структуру руками запрограммировать бы быстро не сумел (да и не стал бы), а несколько дней выпиливал бы какое-нибудь zero-copy решение, которое копий строк не содержит (или по-возможности не содержит).

О сортировке (Ужасы Программирования - 2)

В комментариях к предыдущей записи Влад Шабанов предложил, казалось бы, отличное решение для лексикографической сортировки 8-байтных ключей (функция сравнения для qsort()):

#include "sys/endian.h";
int cmp(const void *d1,const void *d2)
{
    uint64_t a1 = be64toh(* ((uint64_t *)d1));
    uint64_t a2 = be64toh(* ((uint64_t *)d2));
    return (a1  > a2) - (a1 < a2);
}

Однако результат бенчмарка оказался неожиданным: мое наивное и тупое в лоб решение оказалось более чем в полтора раза быстрее, чем предложенная компактная красота.

OpenMP и C++ class members

Что-то у меня затык и гугление не помогает.

class Bar
{
public:
    int  a;
    Bar();
    void run(void);
};

void Bar::run(void)
{
    int i,k;
#pragma omp parallel private(i) firstprivate(k,a)
    {
    }
}

Ругается вот таким нехорошим словом:
omp-test.cpp: In member function 'void Bar::run()':
omp-test.cpp:22: error: 'Bar::a' is not a variable in clause 'firstprivate'

Ну и что с этим делать?

Update Нашел (тоже не очень легко), что возможен такой синтаксис:

class Bar
{
public:
    int  a;
#pragma omp firstprivate(a)
}
А что делать, если Bar::a в одном месте должна быть lastprivate, а в другом - reduction? Временные переменные заводить?

Subscribe to С++