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?
AFAIK - es kann einige Leistungseinbußen sein. x86 korrigiert die Fehlausrichtung automatisch. – valdo
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. –
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