Поделиться через


align

Помещает хранилище определенного размера — выровненное по заданной спецификации выравнивания — по первому возможному адресу заданного хранилища.

void* align(
    size_t Alignment, // input
    size_t Size,      // input
    void*& Ptr        // input/output
    size_t& Space     // input/output
);

Параметры

  • Alignment
    Граница выравнивания для выполнения попытки.

  • Size
    Размер в байтах для выровненного хранилища.

  • Ptr
    Начальный адрес доступного смежного пула хранилища для использования. Этот параметр также является параметром вывода и будет содержать новый начальный адрес, если выравнивание выполняется успешно.

    Если align() выполняется неудачно, этот параметр не изменяется.

  • Space
    Полный размер пространства, доступного align(), для использования при создании выровненного хранилища. Этот параметр также является параметром вывода и содержит откорректированное пространство, оставшееся в хранилище после вычитания выровненного хранилища и всей связанной с ним дополнительной нагрузки.

    Если align() выполняется неудачно, этот параметр не изменяется.

Возвращаемое значение

Указатель null, если запрошенный выровненный буфер не может поместиться в свободное пространство; в противном случае — новое значение Ptr.

Заметки

Измененные параметры Ptr и Space позволяют вызывать align() повторно для того же буфера, возможно, с различными значениями для Alignment и Size. В следующем фрагменте кода показан один из способов использования align().

#include <type_traits> // std::alignment_of()
#include <memory>
//...
char buffer[256]; // for simplicity
size_t alignment = std::alignment_of<int>::value;
void * ptr = buffer;
std::size_t space = sizeof(buffer); // Be sure this results in the true size of your buffer

while (alignment, sizeof(MyObj), ptr, space)) {
    // You now have storage the size of MyObj, starting at ptr, aligned on 
    // int boundary. Use it here if you like, or save off the starting address
    // contained in ptr for later use.
    // ...
    // Last, move starting pointer and decrease available space before
    // the while loop restarts.
    ptr = reinterpret_cast<char*>(ptr) + sizeof(MyObj);
    space -= sizeof(MyObj);
}
// At this point, align() has returned a null pointer, signaling it is not
// possible to allow more aligned storage in this buffer.

Требования

Заголовок: <memory>

Пространство имен: std

См. также

Ссылки

<memory>