50 votes

Comment les données d'un vecteur sont-elles alignées ?

Si je veux traiter des données dans un std::vector avec SSE, j'ai besoin d'un alignement de 16 octets. Comment puis-je y parvenir? Dois-je écrire mon propre allocator ? Ou l'allocateur par défaut s'aligne-t-il déjà sur des limites de 16 octets ?

17voto

Dev Null Points 2271

Au lieu d'écrire votre propre allocator, comme suggéré précédemment , vous pouvez utiliser boost::alignment::aligned_allocator pour std::vector comme ceci :

 #include <vector>
#include <boost/align/aligned_allocator.hpp>

template <typename T>
using aligned_vector = std::vector<T, boost::alignment::aligned_allocator<T, 16>>;

2voto

moose Points 129

Écrivez votre propre répartiteur. allocate et deallocate sont les plus importants. Voici un exemple :

 pointer allocate( size_type size, const void * pBuff = 0 )
{
    char * p;

    int difference;

    if( size > ( INT_MAX - 16 ) )
        return NULL;

    p = (char*)malloc( size + 16 );

    if( !p )
        return NULL;

    difference = ( (-(int)p - 1 ) & 15 ) + 1;

    p += difference;
    p[ -1 ] = (char)difference;

    return (T*)p;
}

void deallocate( pointer p, size_type num )
{
    char * pBuffer = (char*)p;

    free( (void*)(((char*)p) - pBuffer[ -1 ] ) );
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X