24 votes

Détermination de l'alignement maximal possible en C++

Est-ce qu'il y a portable manière de déterminer quel est l'alignement maximum possible pour tout type est ?

Par exemple, sur x86, les instructions SSE requièrent un alignement de 16 octets, mais pour autant que je sache, aucune instruction ne requiert plus que cela, de sorte que tout type peut être stocké en toute sécurité dans un tampon aligné sur 16 octets.

J'ai besoin de créer un tampon (tel qu'un tableau de chars) dans lequel je peux écrire des objets de types arbitraires, et je dois donc pouvoir compter sur le fait que le début du tampon est aligné.

Si tout le reste échoue, je sais que l'allocation d'un tableau de chars avec new est garanti pour avoir un alignement maximal, mais avec les modèles TR1/C++0x alignment_of y aligned_storage Je me demande s'il ne serait pas possible de créer le tampon sur place dans ma classe de tampon, plutôt que de nécessiter l'indirection de pointeur supplémentaire d'un tableau alloué dynamiquement.

Des idées ?

Je réalise qu'il existe de nombreuses options pour déterminer l'alignement maximum pour un ensemble limité de types : Une union, ou juste alignment_of de TR1, mais mon problème est que l'ensemble des types n'est pas limité. Je ne sais pas à l'avance quels objets doivent être stockés dans le tampon.

-2voto

James Taylor Points 1

C'est ce que j'utilise. En plus de cela, si vous allouez de la mémoire, un tableau de caractères new() d'une longueur supérieure ou égale à l'alignement maximum sera aligné sur l'alignement maximum et vous pourrez alors utiliser des index dans ce tableau pour obtenir des adresses alignées.

enum {
            max_alignment = boost::mpl::deref<
                boost::mpl::max_element<
                        boost::mpl::vector<
                            boost::mpl::int_<boost::alignment_of<signed char>::value>::type,
                            boost::mpl::int_<boost::alignment_of<short int>::value>::type,
                            boost::mpl::int_<boost::alignment_of<int>::value>::type,                                boost::mpl::int_<boost::alignment_of<long int>::value>::type,
                            boost::mpl::int_<boost::alignment_of<float>::value>::type,
                            boost::mpl::int_<boost::alignment_of<double>::value>::type,
                            boost::mpl::int_<boost::alignment_of<long double>::value>::type,
                            boost::mpl::int_<boost::alignment_of<void*>::value>::type
                        >::type
                    >::type
                >::type::value
            };
        }

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