Dieses Programm (kompiliert mit Option -std=c++17
)
#include <stdio.h>
#include <string>
void* operator new(std::size_t nrOfBytes) {
printf("allocate %zd bytes on heap\n", nrOfBytes);
void* p = malloc(nrOfBytes);
if (p) {
return p;
} else {
throw std::bad_alloc{};
}
}
int main() {
// new operator is called when compiled with Clang or MSVS or GCC
int* i = new int;
delete i;
// new operator is not called when compiled with GCC
// but is called with Clang and MSVS
std::string str(2000, 'x');
return 0;
}
Beim Kompilieren mit Clang oder MSVS werden folgende Drucke erstellt:
Ordnen Sie 4 Bytes auf dem Heap zu
Ordnen Sie 2016 Bytes auf dem Heap zu
Beim Kompilieren mit GCC (Version 9.2.0 von MSYS unter Windows) wird jedoch nur Folgendes gedruckt:
Ordnen Sie 4 Bytes auf dem Heap zu
Ich bin mir der Optimierung kurzer Zeichenfolgen in GCC / libc ++ bewusst, aber sind 2000 Zeichen nicht zu viele für eine kurze Zeichenfolge? Geht es überhaupt um SSO?
Antworten:
Es scheint, dass GCC das Ersetzen des globalen
operator new
undoperator delete
korrekten nicht implementiert (oder nicht?) Implementiert , wenn dynamische Bibliotheken unter Windows beteiligt sind.Siehe Fehlerberichte, z. B. 77726 , 82122 und 81413 .
In Ihrem Fall befindet sich
std::string
der Konstruktor und / oderstd::allocator<char>::allocate
scheint sich in der dynamischen Bibliothek der Standardbibliothek zu befinden, sodass dieoperator new
verwendete Bibliothek nicht korrekt ersetzt wird.quelle
sizeof(str)
Ausbeute zusammengestellt wird32
.