Khi sử dụng cùng một mã, chỉ cần thay đổi trình biên dịch (từ trình biên dịch C sang trình biên dịch C ++) sẽ thay đổi lượng bộ nhớ được cấp phát. Tôi không chắc tại sao lại như vậy và muốn hiểu thêm về nó. Cho đến nay câu trả lời tốt nhất mà tôi nhận được là "có lẽ là các luồng I / O", điều này không mang tính mô tả và khiến tôi tự hỏi về khía cạnh "bạn không trả tiền cho những gì bạn không sử dụng" của C ++.
Tôi đang sử dụng trình biên dịch Clang và GCC, phiên bản 7.0.1-8 và 8.3.0-6 tương ứng. Hệ thống của tôi đang chạy trên Debian 10 (Buster), phiên bản mới nhất. Các điểm chuẩn được thực hiện thông qua Valgrind Massif.
#include <stdio.h>
int main() {
printf("Hello, world!\n");
return 0;
}
Mã được sử dụng không thay đổi, nhưng cho dù tôi biên dịch dưới dạng C hay C ++, nó sẽ thay đổi kết quả của điểm chuẩn Valgrind. Tuy nhiên, các giá trị vẫn nhất quán giữa các trình biên dịch. Việc phân bổ thời gian chạy (cao điểm) cho chương trình như sau:
- GCC (C): 1,032 byte (1 KB)
- G ++ (C ++): 73,744 byte, (~ 74 KB)
- Clang (C): 1,032 byte (1 KB)
- Clang ++ (C ++): 73,744 byte (~ 74 KB)
Để biên dịch, tôi sử dụng các lệnh sau:
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
Đối với Valgrind, tôi chạy valgrind --tool=massif --massif-out-file=m_compiler_lang ./compiler-lang
trên từng trình biên dịch và ngôn ngữ, sau đó ms_print
để hiển thị các đỉnh.
Tôi đang làm gì đó sai ở đây?