Есть кусок шареной памяти, часть которого хочется рассматривать как массив 64-битных атомарных переменных.
Обычно я юзал GCC atomic buildins, например __sync_fetch_and_add
для сложения с моей атомарной переменной. Кстати, должен ли я юзать при этом только выровненные адреса? Или MOV на платформе x86 атомарен на любых кривых адресах? По-моему не должен, ну ладно.
Так вот, такой код перестал казаться кошерным, захотелось заюзать std::atomic<uint64_t> в шареной памяти. Есть способы трактовать уже выделенный кусок памяти как последовательность нескольких таких объектов? Или надо вызвать несколько раз placelent new, чтобы отработал конструктор? На моей платформе std::atomic в конструкторе делает ничего (как я понял), стейта никакого не хранит и оверхеда по памяти ноль. Казалось бы, я могу просто скастить указатель и счастье, но на других платформах такое может рвануть не по-детски.
Как я понял, нормального кросс-платформенного решения на тему «трактовать уже выделенную память как массив std::atomic - ов для простого интегрального типа» нет. Народ говорит о каких-то полиморфных аллокаторах, которые на стадии экспериментов и вне стандарта пока.
Выскажитесь по сабжу.