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
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.
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.
Ceci est spécifique au compilateur. Avec GCC x86, vous utiliseriez
-malign-double
: "double" prétend avoir été injustement calomnié! – caf
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"]));
}
- 1. Transposition bit à bit de 8 octets
- 2. 8 octets Entier avec Doctrine et PHP
- 3. Pourquoi TADOBlobField.Savetofile n'écrit que 8 octets
- 4. 3 octets UTF-8 Chaîne de remplacement en .NET (Convertir 3 octets UTF-8 en chaîne ou Char)
- 5. Ecrit UTF-8 dans un champ SQL Texte utilisant ADO.Net et conserve les octets UTF-8
- 6. Conversion de caractères multi-octets en UTF-8
- 7. long double vs double
- 8. Cryptage DES de 8 octets en texte brut résultats dans le tableau de 16 octets
- 9. Comment générer une valeur hexadécimale de 8 octets?
- 10. Comment inverser l'ordre des octets d'une chaîne de 8 octets en Perl?
- 11. Comment saisir des caractères UTF-8 de 4 octets?
- 12. DAL: question sur les limites du dépôt
- 13. WPF, animer sur les limites des conteneurs
- 14. Comment représenter les 8 octets du hachage MD5 des octets du codage UTF-8 de la chaîne donnée en tant que java long?
- 15. Invalider les limites de la boucle
- 16. Calayer animer les limites
- 17. octets UTF-8 à un autre encodage en Python
- 18. Suppression des octets [] s en double d'une collection
- 19. Les limites de demande sont-elles dans BITS/BYTES?
- 20. Tous les caractères Kanji en UTF-8 sont-ils de 3 octets?
- 21. Modifier les limites ListViewItem
- 22. Comprendre les octets Java
- 23. Limites de l'objectif C sur l'iPhone
- 24. JSF obtenir le double caractères UTF-8 codé
- 25. Les gens qui double-cliquent tout sur les pages Web ... jQuery double-cliquez sur le problème
- 26. Un accès mémoire non aligné sur 8 octets entraîne une violation de l'accès mémoire sur l'iPhone 3GS avec iOS 4.0
- 27. Django double-t-il une chaîne Unicode (utf-8?)?
- 28. Javascript RegExp et les limites
- 29. Les limites de la fenêtre Silverlight
- 30. Maximiser la forme sur les deux écrans (moniteur double écran)
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
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