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 phân bổ. Tôi không chắc tại sao lại như vậy và muốn hiểu nó nhiều hơn. Cho đến nay, phản hồi tốt nhất mà tôi nhận được là "có thể là luồng I / O", không 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), 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 thành C hay C ++, nó sẽ thay đổi kết quả của điểm chuẩn Valgrind. Các giá trị vẫn nhất quán trên các trình biên dịch, tuy nhiên. Việc phân bổ thời gian chạy (cao điểm) cho chương trình diễn ra 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?
try
khối với chi phí của một bộ nhớ lớn hơn, có thể bằng một bảng nhảy hoặc một cái gì đó. Có thể thử biên dịch mà không có ngoại lệ và xem những gì có tác động. Chỉnh sửa: Trên thực tế, lặp đi lặp lại thử vô hiệu hóa các tính năng c ++ khác nhau để xem tác động nào đến dấu chân bộ nhớ.
clang++ -xc
thay vì clang
, phân bổ tương tự đã có, điều này cho thấy mạnh mẽ là do các thư viện được liên kết
C
chính xác trong chế độ và cùng một số lượng chính xác của C++
chế độ byte . Bạn đã thực hiện một lỗi sao chép?