2010-12-09 53 views
3

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?

+0

AFAIK - il peut y avoir une certaine dégradation des performances. x86 corrige le désalignement automatiquement. – valdo

+2

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. –

+0

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

Répondre

3

Sur les fenêtres de 32 bits, il sera potentiellement plus lent car le matériel peut gérer les accès aux données non alignés, mais plus lentement.

Sur d'autres systèmes/plates-formes d'exploitation, il sera probablement causer un accident (ou très lente performance du système d'exploitation attrape l'accès mémoire non alignés et pour vous simuler dans certains cas)