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 ?
Réponses
Trop de publicités?
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>>;
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 ] ) );
}