Dans mon programme Visual C++ j'utilise un operator new
personnalisé qui utilise malloc()
pour allouer de la mémoire. Ma commande operator new
stocke des données supplémentaires dans les 4 premiers octets de mémoire et renvoie un pointeur de décalage comme le début du bloc (le programme est de 32 bits):Que se passe-t-il si mon allocateur de mémoire personnalisé Visual C++ renvoie un bloc non aligné correctement?
void* operator new(size_t size)
{
size += sizeof(int);//assume it doesn't overflow
int* result = static_cast<int*>(malloc(size));
if(result == 0) {
throw std::bad_alloc;
}
*result = ... //write extra data
return result + 1;
}
Maintenant, si le code de l'appelant souhaite stocker une variable de taille 64 bits (__int64
ou double
) le bloc ne sera pas correctement aligné pour cela.
Quels problèmes cela peut-il provoquer dans un programme Windows 32 bits?
AFAIK - il peut y avoir une certaine dégradation des performances. x86 corrige le désalignement automatiquement. – valdo
Cela peut causer un plantage si des instructions SIMD sont utilisées qui nécessitent des adresses de mémoire alignées sur 8 ou 16 octets (la plupart le font), sinon une dégradation des performances. –
Rejoignez le club. J'ai aussi mon propre allocateur de mémoire (principalement pour simplifier le débogage des problèmes liés à la mémoire, les statistiques de journalisation, les rapports de fuite, ...). J'utilise un entête que je remballe toujours à un multiple de 8 octets et je n'ai jamais eu de problèmes avec ça. Mais je ne sais pas pour 4 octets. – Patrick