Aligné malloc en C++
J'ai une question sur le problème de 13,9 dans le livre, "fendre le codage interview".
La question est d'écrire une aligné alloc et une fonction qui prend en charge l'allocation de la mémoire, et dans sa réponse, le code est donné ci-dessous:
void *aligned_malloc(size_t required_bytes, size_t alignment) {
void *p1;
void **p2;
int offset=alignment-1+sizeof(void*);
if((p1=(void*)malloc(required_bytes+offset))==NULL)
return NULL;
p2=(void**)(((size_t)(p1)+offset)&~(alignment-1)); //line 5
p2[-1]=p1; //line 6
return p2;
}
Je suis tellement confondue avec la ligne 5 et la ligne 6. Pourquoi dois-tu faire un "et" puisque vous avez déjà ajoutez un décalage de p1? et ce n'est [-1] signifie? Merci pour l'aide à l'avance.
C'est que le code exact du livre? Il ne manque plus à l'appel à malloc...
désolé, juste fixe
désolé, juste fixe
OriginalL'auteur Ming | 2012-09-20
Vous devez vous connecter pour publier un commentaire.
Votre exemple de code n'est pas complet. Il alloue rien. Il est assez évident qu'il vous manque un malloc déclaration, qui définit le pointeur p1. Je n'ai pas le livre, mais je pense que le code doit remonte le long de ces lignes:
Alors ... quel est le code?
Je vais deviner que aligned_free est quelque chose comme:
OriginalL'auteur Uri
p1 est l'affectation réelle. p2 est le pointeur retourné, qui renvoie à la mémoire passé le point de répartition et laisse suffisamment d'espace pour les deux allignment ET stocker l'alloués pointeur dans la première place. lorsque aligned_free() est appelée, p1 sera récupéré pour faire de la "vraie" free().
Concernant le peu de maths, cela devient un peu plus lourd, mais il fonctionne.
Rappelez-vous, p1 est la répartition réelle de référence. Pour les coups de pied, permet de supposer la suite, avec des pointeurs 32 bits:
Ce qui est important, c'est l'original
malloc()
qui accorde 0x43 octets d'espace au-dessus et au-delà de la demande initiale. C'est pour assurer à la fois l'alignement de mathématiques et l'espace pour le pointeur de 32 bits peuvent être pris en compte:p2 est aligné sur une 0x40 limite (c'est à dire tous les bits dans 0x3F sont à 0) et assez d'espace est laissé pour stocker le pointeur de 4 octets pour l'allocation initiale, référencé par p1.
Il a été jamais depuis que j'ai fait de l'alignement des maths, donc si je f ed l'bits, veuillez quelqu'un de s'en corriger.
(p1 + offset) & ~(alignment - 1)
même résultat en p1 d'origine ? En d'autres termes, la déclarationp2[-1]=p1;
seraient le résultat d'une segmentation fault puisque l'on est en train d'essayer d'accéder à une mémoire devant le bloc de mémoire. S'il vous plaît laissez-moi savoir.OriginalL'auteur WhozCraig
Et par la manière, ce n'est pas la seule façon de le faire.
Comme un exemple de taille = 20, alignement = 16 et crt malloc renvoyé l'adresse 10. et en supposant que sizeof(size_t) 4 octets
commencer
Même manière, align_free sera jeté vide pointeur vers size_t pointeur, reculer d'un seul emplacement, lire la valeur qui y sont stockées et ajuster le décalage de se déplacer à la crt alloc début
Optimisation: Vous n'avez pas besoin sizeof(size_t) allocation supplémentaire si votre alignement a été plus que sizeof(size_t)
OriginalL'auteur mithya