Je souhaite écrire un code memcpy qui copie mot par mot au lieu de byte by byte pour augmenter la vitesse. (Bien que j'ai besoin de faire un peu d'octet par octet pour les derniers octets ou quelques octets). Je veux donc que mon adresse source et destination soit correctement alignée. J'ai vu la mise en œuvre de memcpy dans la glibc https://fossies.org/dox/glibc-2.22/string_2memcpy_8c_source.html il ne alignement que pour l'adresse de destination. Mais même si l'adresse de la source n'est pas correctement alignée, cela entraînera une erreur de bus (la vérification de l'alignement est activée dans mon CPU). Je ne suis pas sûr de savoir comment aligner correctement la source et la destination. Parce que si j'essaie d'aligner la source en copiant quelques octets par octet par octet, cela changera aussi l'adresse de destination, donc d'abord l'adresse de destination qui a été alignée d'abord correctement pourrait ne pas être correctement alignée maintenant. Alors est-il possible d'aligner les deux? Aidez-moi, s'il vous plaît.Alignement de l'adresse source et de destination dans memcpy
void memcpy(void *dst, void *src,int size)
{
if(size >= 8)
{
while(size/8) /* code will give sigbus error if src = 0x10003 and dst = 0x100000 */
{
*((double*)dst)++ = *((double*)src)++;
size = size - 8;
}
}
while(size--)
{
*((char*)dst)++ = *((char*)src)++;
}
}
Je ne comprends pas comment vous pouvez aligner l'adresse source ET dest? Je suis désolé, je ne comprends pas? –
@MartinJames Considérons que je passe src = 0x10003 dest = 0x100000 et la taille de 15. Si dans memcpy je veux faire mot par mot copie, je veux aligner src pour être multiple de 8 (64 bits OS) donc le prochain numéro qui est multiple de 8 est 0x10006, donc pour les 3 premiers octets je vais faire byte by byte copy, si je fais que src sera 0x10006 mais dest = 0x100003, encore une fois maintenant dest n'est pas un multiple de 8. ce problème continuera. Alors, comment puis-je aligner src et dest ici. Si ce n'est pas possible, existe-t-il un autre moyen de faire une copie mot par mot? – Praveen
Vous ne pouvez pas. En supposant que vous déplacez un bloc de mots, si la source est étrange mais la cible est égale, vous êtes en quelque sorte en train d'aligner des mots mal alignés. D'un autre côté, si la source est paire et la cible est étrange, vous désalignez les mots alignés.Vous serez soit en train de lire ou d'écrire des mots mal alignés - n'est pas non plus impossible de copier un octet à la fois. –