С++

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

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

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

class someShit{
        char *m_sBuffer;
        size_t m_iLimit;
        size_t m_iCounter;
};
то никто не может гарантировать, что где-то...

Смерть Кащея

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

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

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

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

Но вторая сторона проблемы остается забытой: на 32-битной архитектуре каждый vector - это 12 байт, список - 8 (плюс 8 на каждый элемент), строка - 4 (ну хоть тут нет оверхеда). Когда мы это намешаем в кучу - получим десятки байт оверхеда на каждый элемент. А элементов может быть много. И когда их становятся первые миллионы - оверхед вдруг становится первыми сотнями мегабайт и это уже после утаптывания кода.

Потом, все это нужно аллоцировать/деаллоцировать. И Malloc Trace мне гордо сообщает, что при обработке 60 тысяч входных элементов в трейс записались 2 миллиона событий. Понятно, отчего все так хотят быстрый malloc.

Ну и не забываем, что просто побегать по плотному массиву (пусть и аллоцированному с небольшим запасом), особенно выровненому на 32 байта - это одно. А 3-4 dereference на каждый элемент - совсем другое, кэш не резиновый.

Все совпадения с реальным кодом являются случайными, все персонажи выдуманы.

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

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

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

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 С++