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