2010-03-03 4 views
4

Existe-t-il un idiome portable courant en code numérique (j'écris en D, mais en langage indépendant, les réponses C et C++ me seraient également utiles) pour m'assurer que tous les doublons alloués en pile sont alignés sur les limites de 8 octets? J'optimise actuellement certains codes numériques où des doubles alloués par pile mal alignés (uniquement alignés sur des limites de 4 octets) provoquent une baisse de performance de 1,5 à 2 fois.L'alignement double sur les limites de 8 octets?

Répondre

2

En C++, vous pouvez utiliser __declspec(align(#)) comme:

__declspec(align(32)) struct Str1{ 
    int a, b, c, d, e; }; 

ou plus approprié à ce que vous recherchez, un double aligné sur une limite de 32 bits:

__declspec(align(32)) double a; 

Il y a un bel article à propos de l'alignement des données sur Windows here, vous voudrez peut-être vérifier.

3

Dans « C », vous devez utiliser un syndicat pour forcer l'alignement si vous ne voulez pas compter sur les options du compilateur ou directives:

#include <stdint.h> 

typedef union _foo 
{ 
    uint64_t align; 
    double d; 
} foo 

Cela garantira que sont alignés 64 bits vos doubles, cela rend juste l'accès un peu plus fastidieux.

Alternativement, si cela ne vous dérange pas de compter sur le compilateur, gcc supporte la directive #pragma pack(64) qui impose l'alignement 64 bits pour tout.

+0

S'il vous plaît laisser un commentaire si vous allez me voter pour que je puisse comprendre pourquoi vous sentez que ma réponse est eit son tort ou pas utile. – SiegeX

+2

Ce n'est pas moi qui vous ai rejeté, mais la raison la plus probable est que pour la plupart des compilateurs, 'double' et' uint64_t' auront les mêmes exigences d'alignement, c'est-à-dire que l'union ne vous rapportera rien – Christoph

4

Ceci est spécifique au compilateur. Avec GCC x86, vous utiliseriez

-malign-double 
+3

: "double" prétend avoir été injustement calomnié! – caf

1

en D vous pouvez essayer d'aligner la fonction bibliothèque attribut ou alignForSize

http://www.digitalmars.com/d/2.0/attribute.html#align

struct S 
{ align(4) byte a; // placed at offset 0 
    align(4) byte b; // placed at offset 1 
} 

align (1) struct S 
{ byte a; // placed at offset 0 
    byte[3] filler1; 
    byte b; // placed at offset 4 
    byte[3] filler2; 
} 

http://www.digitalmars.com/d/2.0/phobos/std_typecons.html#alignForSize

struct Banner { 
    mixin(alignForSize!(byte[6], double)(["name", "height"])); 
} 
Questions connexes