Este programa (compilado con la opción -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;
}
Cuando se compila con Clang o MSVS, imprime:
asignar 4 bytes en el montón
asignar 2016 bytes en el montón
Sin embargo, cuando se compila con GCC (Versión 9.2.0 proporcionada por MSYS en Windows) solo imprime:
asignar 4 bytes en el montón
Soy consciente de la optimización de cadenas cortas en GCC / libc ++, pero ¿no son 2000 caracteres demasiado para una cadena corta? ¿Es una cuestión de SSO?
Respuestas:
Parece que GCC no implementa (o no puede) la sustitución de la global
operator new
yoperator delete
correctamente cuando las bibliotecas dinámicas están involucradas en Windows.Ver informes de errores, por ejemplo, 77726 , 82122 y 81413 .
En su caso
std::string
, el constructor y / ostd::allocator<char>::allocate
parece estar ubicado en la biblioteca dinámica de la biblioteca estándar, de modo que eloperator new
que utiliza no se está reemplazando correctamente.fuente
sizeof(str)
rendimiento32
.