Considere este programa vazio:
int main()
{ return 0; }
Se eu compilar com C++ com g++ main.cpp && strace ./a.out
, e analisar a saída com strace
, observei que as últimas linhas da saída são (você pode acrescentar -O3
que o efeito é o mesmo):
mprotect(0x7f71af154000, 45056, PROT_READ) = 0
mprotect(0x7f71af38b000, 4096, PROT_READ) = 0
brk(NULL) = 0xed2000
brk(0xf05000) = 0xf05000
exit_group(0) = ?
+++ exited with 0 +++
No entanto, se eu fizer isso:gcc main.cpp && strace ./a.out
mprotect(0x7f4114318000, 16384, PROT_READ) = 0
mprotect(0x7f4114547000, 4096, PROT_READ) = 0
exit_group(0) = ?
+++ exited with 0 +++
Como você vê, em C++ há um extra brk
que estende o heap em exatamente 204 KB (0xf05000 - 0xed2000 = 204 KB após traduzir ambos para decimal). Isso pode ser facilmente verificado substituindo esse programa por ( link coliru ):
#include <iostream>
#include <unistd.h>
int main()
{
char buf[1024];
sprintf(buf, "pmap -XX %u", getpid());
std::system(buf);
return 0;
}
e você pode facilmente observar que a compilação com g++
o [heap]
tem um tamanho de 204 KB, e com gcc
a [heap]
linha até desapareceu da pmap
saída.
NOTA: A propósito, e para minha surpresa, o gcc não teve nenhum problema com include <iostream>
e com a presença de std
in std::system
.
Para que servem esses 204 KB? Não estou preocupado nem nada sobre esses pequenos 204 KB, mas eles chamaram minha atenção e estou curioso agora.
Remova as bibliotecas adicionadas
g++
e não haverá alocação extra:Com as bibliotecas padrão, o programa C++ é vinculado a:
Sem as bibliotecas padrão +
libc
:As bibliotecas extras são:
Ao adicionar bibliotecas extras à vinculação, uma de cada vez, podemos ver que é isso
libstdc++
que causa a alocação extra. Portanto, se você puder dispensar a parte compilada da biblioteca padrão do C++, é isso que você pode usar:A execução passo a passo do programa compilado com as bibliotecas padrão mostra a construção e a destruição de diversos objetos C++ padrão, como este
std::atomic<std::shared_ptr<std::chrono::tzdb_list::_Node>>
. O banco de dados de fuso horário sozinho deve ocupar um pouco de espaço, mas não tenho certeza se ele cobre todos os 2 KiB que você observou. A conclusão é, no entanto, que a biblioteca padrão C++ tem mais objetos (além daqueles na biblioteca padrão C) que são construídos implicitamente (osiostream
s padrão, por exemplo):