Aynı kodu kullanırken, derleyiciyi (C derleyicisinden C ++ derleyicisine) değiştirmek, ne kadar bellek ayrılacağını değiştirir. Bunun neden olduğundan emin değilim ve daha fazla anlamak istiyorum. Şimdiye kadar aldığım en iyi yanıt "muhtemelen I / O akışları", bu çok açıklayıcı değil ve bana C ++ "kullanmadığınız için ödeme yapmaz" yönü hakkında merak ediyor.
Sırasıyla 7.0.1-8 ve 8.3.0-6 sürümleri olan Clang ve GCC derleyicilerini kullanıyorum. Sistemim en son Debian 10 (Buster) üzerinde çalışıyor. Kıyaslamalar Valgrind Massif aracılığıyla yapılır.
#include <stdio.h>
int main() {
printf("Hello, world!\n");
return 0;
}
Kullanılan kod değişmez, ancak C ya da C ++ olarak derlesem Valgrind karşılaştırmasının sonuçlarını değiştirir. Ancak değerler derleyiciler arasında tutarlı kalır. Program için çalışma zamanı ayırmaları (tepe noktası) aşağıdaki gibidir:
- GCC (C): 1.032 bayt (1 KB)
- G ++ (C ++): 73,744 bayt, (~ 74 KB)
- Clang (C): 1.032 bayt (1 KB)
- Clang ++ (C ++): 73,744 bayt (~ 74 KB)
Derleme için aşağıdaki komutları kullanıyorum:
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
Valgrind için, valgrind --tool=massif --massif-out-file=m_compiler_lang ./compiler-lang
her derleyici ve dilde, sonra ms_print
zirveleri görüntülemek için çalışıyorum.
Burada yanlış bir şey mi yapıyorum?
try
, belki de bir atlama tablosu veya başka bir şeyle, daha büyük bir bellek ayak izi pahasına bir bloğa girmenin performansının olmadığı bir istisna modeline sahip olmalıdır . İstisnasız derlemeyi deneyin ve bunun nasıl bir etkisi olduğunu görün. Düzenleme: Aslında, iteratif olarak bellek ayak izi üzerinde ne etkisi görmek için çeşitli c ++ özellikleri devre dışı bırakmayı deneyin.
clang++ -xc
Bunun yerine derlerken clang
, aynı tahsisat oradaydı, bu da bağlantılı kütüphaneler nedeniyle olduğunu şiddetle tavsiye ediyor
C
modda tam olarak aynı sayıda bayt ve aynı sayıda bayt C++
modunda oluşturduğundan şüpheleniyorum . Bir transkripsiyon hatası mı yaptınız?