Lorsque vous utilisez le même code, changer simplement le compilateur (d'un compilateur C à un compilateur C ++) changera la quantité de mémoire allouée. Je ne sais pas trop pourquoi et j'aimerais mieux comprendre. Jusqu'à présent, la meilleure réponse que j'ai obtenue est "probablement les flux d'E / S", ce qui n'est pas très descriptif et me fait m'interroger sur l'aspect "vous ne payez pas pour ce que vous n'utilisez pas" du C ++.
J'utilise les compilateurs Clang et GCC, versions 7.0.1-8 et 8.3.0-6 respectivement. Mon système fonctionne sur Debian 10 (Buster), le dernier. Les benchmarks se font via Valgrind Massif.
#include <stdio.h>
int main() {
printf("Hello, world!\n");
return 0;
}
Le code utilisé ne change pas, mais que je compile en C ou en C ++, cela change les résultats du benchmark Valgrind. Les valeurs restent cependant cohérentes entre les compilateurs. Les allocations d'exécution (pic) pour le programme se présentent comme suit:
- GCC (C): 1 032 octets (1 Ko)
- G ++ (C ++): 73 744 octets, (~ 74 Ko)
- Clang (C): 1 032 octets (1 Ko)
- Clang ++ (C ++): 73 744 octets (~ 74 Ko)
Pour la compilation, j'utilise les commandes suivantes:
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
Pour Valgrind, je tourne valgrind --tool=massif --massif-out-file=m_compiler_lang ./compiler-lang
sur chaque compilateur et langage, puis ms_print
pour afficher les pics.
Est-ce que je fais quelque chose de mal ici?
try
bloc au détriment d'une plus grande empreinte mémoire, peut-être avec une table de saut ou quelque chose. Essayez peut-être de compiler sans exceptions et voyez quel impact cela a. Edit: En fait, essayez de désactiver de manière itérative diverses fonctionnalités c ++ pour voir quel impact cela a sur l'empreinte mémoire.
clang++ -xc
au lieu de clang
, la même allocation était là, ce qui suggère fortement que cela est dû aux bibliothèques liées
C
mode et le même nombre exact d'octets en C++
mode. Avez-vous fait une erreur de transcription?