Выровненный динамический массив и умный указательC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Выровненный динамический массив и умный указатель

Сообщение Anonymous »

Мне часто нужно выровнять начало динамического массива по границе в 16, 32 или 64 байта для векторизации, например, для SSE, AVX, AVX-512. Я ищу прозрачный и безопасный способ использовать это в сочетании с интеллектуальными указателями, в частности std::unique_ptr.

Учитывая реализацию распределения и процедуры освобождения, скажем

Код: Выделить всё

template
T * allocate_aligned(int alignment, int length)
{
// omitted: check minimum alignment, check error
T * raw = 0;
// using posix_memalign as an example, could be made platform dependent...
int error = posix_memalign((void **)&raw, alignment, sizeof(T)*length);
return raw;
}

template
struct DeleteAligned
{
void operator()(T * data) const
{
free(data);
}
};
Я бы хотел сделать что-то подобное

Код: Выделить всё

std::unique_ptr data(allocate_aligned(alignment, length));
но я не мог понять, как заставить unique_ptr использовать правильный метод удаления, не требуя от пользователя его указания (что потенциальная причина ошибок). Альтернативой, которую я нашел, было использование псевдонима шаблона

Код: Выделить всё

template
using aligned_unique_ptr = std::unique_ptr;
Тогда мы можем использовать

Код: Выделить всё

aligned_unique_ptr data(allocate_aligned(alignment, length));
Остальная проблема заключается в том, что ничто не мешает пользователю поместить необработанный указатель в std::unique_ptr.

Кроме этого, вы видите в этом что-то плохое? Есть ли альтернатива, менее подверженная ошибкам, но полностью прозрачная для пользователя после того, как распределение было выполнено?

Подробнее здесь: https://stackoverflow.com/questions/294 ... rt-pointer
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Умный указатель создает неэффективный скомпилированный код
    Anonymous » » в форуме C++
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Умный указатель создает неэффективный скомпилированный код
    Anonymous » » в форуме C++
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Умный указатель создает неэффективный скомпилированный код
    Anonymous » » в форуме C++
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Умный указатель создает неэффективный скомпилированный код
    Anonymous » » в форуме C++
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • C ++ Умный указатель и модель памяти: почему приращения не синхронизируются с уменьшением управляющего блока?
    Anonymous » » в форуме C++
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»