std::align
Definido en el archivo de encabezado <memory>
|
||
void* align( std::size_t alignment, std::size_t size, |
(desde C++11) | |
Dado un puntero ptr a un búfer de tamaño space, devuelve un puntero alineado por el alignment especificado para size número de bytes y decrementa el argumento space por el número de bytes usados para la alineación. Se devuelve la primera dirección alineada.
La función modifica el puntero solo si fuera posible ajustar el número deseado de bytes alineados por la alineación dada en el búfer. Si el búfer es demasiado pequeño, la función no hace nada y devuelve nullptr.
El comportamiento no está definido si alignment no es un potencia de dos.
Contenido |
[editar] Parámetros
alignment | - | La alineación deseada. |
size | - | El tamaño del almacenamiento a alinear. |
ptr | - | Puntero al almacenamiento contiguo de al menos space bytes.
|
space | - | El tamaño del búfer en el cual operar. |
[editar] Valor de retorno
El valor ajustado de ptr
, o valor de puntero nulo si el espacio proporcionado es demasiado pequeño.
[editar] Ejemplo
Demuestra el uso de std::align para colocar objetos de diferente tipo en la memoria.
#include <iostream> #include <memory> template <std::size_t N> struct MyAllocator { char data[N]; void* p; std::size_t sz; MyAllocator() : p(data), sz(N) {} template <typename T> T* aligned_alloc(std::size_t a = alignof(T)) { if (std::align(a, sizeof(T), p, sz)) { T* result = reinterpret_cast<T*>(p); p = (char*)p + sizeof(T); sz -= sizeof(T); return result; } return nullptr; } }; int main() { MyAllocator<64> a; // asignar un char char* p1 = a.aligned_alloc<char>(); if (p1) *p1 = 'a'; std::cout << "un char asignado en " << (void*)p1 << '\n'; // asignar un int int* p2 = a.aligned_alloc<int>(); if (p2) *p2 = 1; std::cout << "un int asignado en " << (void*)p2 << '\n'; // asignar un int, alineado en un límite de 32 bytes int* p3 = a.aligned_alloc<int>(32); if (p3) *p3 = 2; std::cout << "un int asignado en " << (void*)p3 << " (alineación a 32 bytes)\n"; }
Posible salida:
un char asignado en 0x2ff21a08 un int asignado en 0x2ff21a0c un int asignado en 0x2ff21a20 (alineación a 32 bytes)
[editar] Informes de defectos
Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.
ID | Aplicado a | Comportamiento según lo publicado | Comportamiento correcto |
---|---|---|---|
LWG 2377 | C++11 | Se requería que alignment fuera un tipo fundamental o que admitieraun valor de alineación extendido. |
Solo necesita ser una potencia de dos. |
[editar] Véase también
operador alignof (C++11)
|
Consulta los requerimientos de alineación de un tipo (desde C++11) |
especificador alignas (C++11)
|
Especifica que el almacenamiento para la variable debe estar alineado por la cantidad específica |
(C++11) |
Define el tipo adecuado para su uso como almacenamiento sin inicializar para tipos de un tamaño dado (plantilla de clase) |
(C++20) |
Informa al compilador que un puntero está alineado. (plantilla de función) |