เมื่อใช้รหัสเดียวกันการเปลี่ยนคอมไพเลอร์ (จากคอมไพเลอร์ C เป็นคอมไพเลอร์ C ++) จะเปลี่ยนจำนวนหน่วยความจำที่จัดสรร ฉันไม่แน่ใจว่าทำไมถึงเป็นเช่นนี้และต้องการที่จะเข้าใจมากกว่านี้ จนถึงการตอบสนองที่ดีที่สุดที่ฉันได้รับคือ "อาจเป็นสตรีม I / O" ซึ่งไม่ได้อธิบายมากและทำให้ฉันสงสัยเกี่ยวกับ "คุณไม่จ่ายเงินสำหรับสิ่งที่คุณไม่ได้ใช้" แง่มุมของ C ++
ฉันใช้คอมไพเลอร์ Clang และ GCC เวอร์ชัน 7.0.1-8 และ 8.3.0-6 ตามลำดับ ระบบของฉันทำงานบน Debian 10 (Buster) เวอร์ชันล่าสุด มาตรฐานจะทำผ่าน Valgrind Massif
#include <stdio.h>
int main() {
printf("Hello, world!\n");
return 0;
}
รหัสที่ใช้ไม่เปลี่ยนแปลง แต่ไม่ว่าฉันจะคอมไพล์เป็น C หรือเป็น C ++ มันจะเปลี่ยนผลลัพธ์ของเกณฑ์มาตรฐาน Valgrind อย่างไรก็ตามค่ายังคงสอดคล้องกันในคอมไพเลอร์ การจัดสรรรันไทม์ (จุดสูงสุด) สำหรับโปรแกรมดำเนินการดังนี้:
- GCC (C): 1,032 ไบต์ (1 KB)
- G ++ (C ++): 73,744 ไบต์, (~ 74 KB)
- เสียงดังกราว (C): 1,032 ไบต์ (1 KB)
- เสียงดังกังวาน ++ (C ++): 73,744 ไบต์ (~ 74 KB)
สำหรับการรวบรวมฉันใช้คำสั่งต่อไปนี้:
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 ฉันจะใช้งานvalgrind --tool=massif --massif-out-file=m_compiler_lang ./compiler-lang
คอมไพเลอร์และภาษาแต่ละภาษาจากนั้นms_print
แสดงยอดเขา
ฉันกำลังทำอะไรผิดที่นี่?
try
บล็อกด้วยค่าใช้จ่ายของหน่วยความจำขนาดใหญ่อาจมีตารางกระโดดหรืออะไรบางอย่าง อาจลองรวบรวมโดยไม่มีข้อยกเว้นและดูว่ามีผลกระทบอะไรบ้าง แก้ไข: อันที่จริงแล้วลองปิดการใช้งานคุณสมบัติ c ++ ต่าง ๆ ซ้ำ ๆ เพื่อดูว่ามีผลกระทบอะไรบ้างในหน่วยความจำ
clang++ -xc
แทนที่จะมีclang
การจัดสรรแบบเดียวกันซึ่งแนะนำอย่างยิ่งเนื่องจากไลบรารีที่เชื่อมโยง
C
ที่แน่นอนในโหมดเดียวกันและC++
โหมดไบต์จำนวนเดียวกันแน่นอน คุณได้ทำการถอดความผิดพลาดหรือไม่?