Korzystając z tego samego kodu, po prostu zmiana kompilatora (z kompilatora C na kompilator C ++) zmieni ilość przydzielonej pamięci. Nie jestem do końca pewien, dlaczego tak jest i chciałbym to lepiej zrozumieć. Jak dotąd najlepszą odpowiedzią, jaką otrzymałem, jest „prawdopodobnie strumienie I / O”, co nie jest zbyt opisowe i sprawia, że zastanawiam się nad aspektem C ++ „nie płacisz za to, czego nie używasz”.
Używam kompilatorów Clang i GCC, odpowiednio wersje 7.0.1-8 i 8.3.0-6. Mój system działa na Debianie 10 (Buster), najnowszym. Testy porównawcze są wykonywane za pośrednictwem Valgrind Massif.
#include <stdio.h>
int main() {
printf("Hello, world!\n");
return 0;
}
Użyty kod się nie zmienia, ale niezależnie od tego, czy kompiluję jako C czy C ++, zmienia wyniki testu porównawczego Valgrind. Wartości pozostają jednak spójne we wszystkich kompilatorach. Przydziały czasu działania (szczyt) dla programu wyglądają następująco:
- GCC (C): 1032 bajtów (1 KB)
- G ++ (C ++): 73744 bajty, (~ 74 KB)
- Clang (C): 1032 bajtów (1 KB)
- Clang ++ (C ++): 73744 bajty (~ 74 KB)
Do kompilacji używam następujących poleceń:
clang -O3 -o c-clang ./main.c
gcc -O3 -o c-gcc ./main.c
clang++ -O3 -o cpp-clang ./main.cpp
g++ -O3 -o cpp-gcc ./main.cpp
W przypadku Valgrind uruchamiam valgrind --tool=massif --massif-out-file=m_compiler_lang ./compiler-lang
każdy kompilator i język, a następnie ms_print
wyświetlam szczyty.
Czy ja tu robię coś złego?
try
bloku kosztem większej ilości pamięci, być może z tabelą skoków lub czymś podobnym. Może spróbuj kompilować bez wyjątków i zobacz, jaki to ma wpływ. Edycja: W rzeczywistości spróbuj iteracyjnie wyłączyć różne funkcje C ++, aby zobaczyć, jaki wpływ ma to na zużycie pamięci.
clang++ -xc
zamiast clang
, był tam ten sam przydział, co zdecydowanie sugeruje, że jest to spowodowane powiązanymi bibliotekami
C
trybie i dokładnie taką samą liczbę bajtów w C++
trybie. Czy popełniłeś błąd w transkrypcji?