Espacios de nombres
Variantes
Acciones

std::align

De cppreference.com
< cpp‎ | memory
 
 
Biblioteca de servicios
 
Gestión de memoria dinámica
Punteros inteligentes
(C++11)
(C++11)
(C++11)
(hasta C++17)
(C++11)
(C++23)
Asignadores de memoria
Recursos de memoria
Almacenamiento no inicializado
Algoritmos de memoria no inicializada
Algoritmos restringidos de memoria no inicializada
Apoyo para recolección de basura
(C++11)(hasta C++23)
(C++11)(hasta C++23)
(C++11)(hasta C++23)
(C++11)(hasta C++23)
(C++11)(hasta C++23)
(C++11)(hasta C++23)
Misceláneos
(C++20)
(C++11)
align
(C++11)
 
Definido en el archivo de encabezado <memory>
void* align( std::size_t alignment,

             std::size_t size,
             void*& ptr,

             std::size_t& space );
(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 admitiera
un 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) [editar]
especificador alignas(C++11) Especifica que el almacenamiento para la variable debe estar alineado por la cantidad específica [editar]
Define el tipo adecuado para su uso como almacenamiento sin inicializar para tipos de un tamaño dado
(plantilla de clase) [editar]
Informa al compilador que un puntero está alineado.
(plantilla de función) [editar]