2010-12-09 4 views
3

In meinem Visual C++ - Programm verwende ich eine benutzerdefinierte operator new, die malloc() verwendet, um Speicher zuzuordnen. Meine benutzerdefinierte operator new speichert zusätzliche Daten in den ersten 4 Byte Speicher und gibt einen Offset-Zeiger als den Beginn des Blocks (das Programm ist 32 Bit):Was passiert, wenn mein benutzerdefinierter Visual C++ - Speicherzuordner einen nicht ordnungsgemäß ausgerichteten Block zurückgibt?

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; 
} 

Nun, wenn Anrufer Code will eine Variable Größe speichern, 64 Bits (__int64 oder double) der Block wird nicht richtig dafür ausgerichtet.

Welche Probleme kann dies in einem 32-Bit-Windows-Programm verursachen?

+0

AFAIK - es kann einige Leistungseinbußen sein. x86 korrigiert die Fehlausrichtung automatisch. – valdo

+2

Es kann einen Absturz verursachen, wenn SIMD-Anweisungen verwendet werden, die 8- oder 16-Byte-Speicheradressen erfordern (die meisten tun dies), ansonsten nur eine Leistungsverschlechterung. –

+0

Trete dem Club bei. Ich habe auch meinen eigenen Speicherzuordner (hauptsächlich, um das Debugging von Speicherproblemen zu vereinfachen, Protokollierung von Statistiken, Leckberichte, ...). Ich benutze einen Header, den ich immer zu einem Vielfachen von 8 Bytes auffüllen und hatte nie Probleme damit. Aber ich weiß nicht für 4 Bytes. – Patrick

Antwort

3

In 32-Bit-Fenstern ist es möglicherweise nur langsam, da die Hardware mit nicht ausgerichteten Datenzugriffen umgehen kann.

auf andere Betriebssysteme/Plattformen wird es wahrscheinlich zu einem Absturz führen (oder nur sehr geringe Leistung, wie das Betriebssystem den nicht ausgerichteten Speicherzugriff auffängt und simuliert es für Sie in einigen Fällen)

Verwandte Themen