Este programa (compilado com a opção -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;
}
quando compilado com Clang ou MSVS, imprime:
alocar 4 bytes na pilha
alocar 2016 bytes na pilha
No entanto, quando compilado com o GCC (versão 9.2.0 fornecida pelo MSYS no Windows), ele apenas imprime:
alocar 4 bytes na pilha
Estou ciente da otimização de cadeia curta no GCC / libc ++, mas 2000 caracteres não são muitos para uma cadeia curta? É uma questão de SSO?
Respostas:
Parece que o GCC não implementa (ou não pode?) Implementar a substituição do global
operator new
eoperator delete
corretamente quando bibliotecas dinâmicas estão envolvidas no Windows.Veja relatórios de bugs, por exemplo, 77726 , 82122 e 81413 .
No
std::string
construtor do seu caso e / oustd::allocator<char>::allocate
parece estar localizado na biblioteca dinâmica da biblioteca padrão, para queoperator new
ela não seja substituída corretamente.fonte
sizeof(str)
rendimento32
.