Đối với chương trình từ http://bellard.org/mersenne.html GCC tạo ~ 130MB thực thi. Tại sao?GCC kết quả đầu ra rất lớn thực thi cho chương trình Mersenne
Trả lời
Hãy thử thay đổi t[1<<25]={2}
thành t[1<<25]
và kích thước * thực thi ** sẽ thả xuống 7.3 K. (Không cần phải nói, bạn sẽ không nhận được kết quả phù hợp)
Nếu nó chỉ là t[1<<25]
, nó sẽ không có bất kỳ không gian nào cả. Bắt buộc ở đây là mảng đang được khởi tạo (phần tử đầu tiên = 2, 2^25-1 phần tử tiếp theo tất cả 0) và mảng toàn cục được đặt trong đoạn dữ liệu chỉ vì nó được khởi tạo.
Tạo lắp ráp cho 2 phiên bản và kiểm tra sự khác biệt làm cho nó thậm chí còn rõ ràng hơn:
[[email protected] ~]$ diff without_mem.s with_mem.s
15c15,21
< .comm t,134217728,32
---
> .globl t
> .align 32
> .type t, @object
> .size t, 134217728
> t: ***<- HERE!***
> .long 2
> .zero 134217724
Như chúng ta có thể nhận thấy, trong phiên bản gốc, lắp ráp được định hướng để tạo ra 2^27 (134217728) byte trong phân đoạn dữ liệu. Vì vậy, nó trở thành một phần của tập tin đối tượng chính nó. (Bạn có thể tạo lắp ráp bằng cách biên dịch với -S
chuyển đổi gcc -S -fverbose-asm t1.c
)
Nhưng tại sao 129 MB?
1<< n= 2^n (1 left shifted n times). => 1<<25=2^25. now 1 Integer= 4 bytes =2^2 bytes => 2^25 Integers=2^27 bytes=2^7 * 1 M bytes= 128 MBs
Để biết thêm chi tiết, xem:
* Lưu ý 1: Đây là một object file về nghiêm ngặt.
Lưu ý 2: Như đã nêu trong các nhận xét, Cũng có thể lưu ý rằng tổng kích thước của quá trình (chương trình đang thực thi) sẽ là 129Mb ngay cả khi thực thi là 7,3K. (Bộ nhớ sẽ được cấp phát khi chương trình bắt đầu thực hiện). Bạn có thể thấy việc sử dụng bộ nhớ của chương trình của bạn bằng cách sử dụng lệnh top
.
Lưu ý 3: Cần nhấn mạnh rằng điều này chỉ giữ vì t là toàn cầu. Phân bổ dữ liệu cục bộ cho một hàm vẫn xảy ra khi chạy trên ngăn xếp. Vì vậy, nếu t
là cục bộ, tệp đối tượng sẽ chỉ được thực hiện 7,3K.
Lưu ý 4: Đã khởi tạo static
biến cục bộ, như hình cầu được tạo ban đầu, cũng được giữ trong phân đoạn data
. Một toàn cầu là static
toàn cầu là giống như toàn bộ ngoại trừ việc bạn chỉ giới hạn phạm vi của biến cho tệp hiện tại.
Ngay cả khi kích thước thực thi là 7.3K thì kích thước quá trình vẫn là 130 MB. –
@brianbeuning Nó là khá rõ ràng, nhưng vẫn được bổ sung cho đầy đủ. – axiom
Điều này là tuyệt vời, tôi đã được brace-initializing mảng kích thước đáng kể _many_ lần với GCC và không bao giờ nhìn thấy một điều như vậy. Chỉ có dữ liệu không thống nhất được đặt trong tệp thực thi, mọi thứ khác được khởi tạo bằng vòng lặp 'memset'. Có lẽ đó là một số tối ưu hóa lẻ hoặc cờ gỡ lỗi đang được sử dụng? – Damon
- 1. Tại sao tôi không nhận được đầu ra cho chương trình Hello World rất đơn giản?
- 2. Thực thi chương trình trong php - hiển thị và trở đầu ra
- 3. GCC: Chương trình trống == 23202 bytes?
- 4. Kết quả đầu ra php-cli thay vì thực hiện
- 5. Sử dụng subprocess.Popen cho quá trình với đầu ra lớn
- 6. Java thực thi chương trình dòng lệnh
- 7. Chương trình mở rộng thập phân chạy rất chậm đối với các đầu vào lớn
- 8. Kết quả nguồn MySQL đầu ra cho tệp nhật ký
- 9. Eclipse: Bật Lưu thực thi chương trình
- 10. Thực thi chương trình C trong Linux ga
- 11. thực thi rất lớn vì các biểu tượng gỡ lỗi, tại sao?
- 12. kết quả CUDA trả rác sử dụng mảng rất lớn, nhưng báo cáo không có lỗi
- 13. Chỉnh sửa tệp kết xuất sql rất lớn (trên linux)
- 14. Đầu ra của chương trình này ra sao?
- 15. Đầu ra của chương trình và thời gian Python
- 16. Làm cách nào để có được kết quả (đầu ra tiêu chuẩn) của lệnh thực thi TCL?
- 17. Chạy chương trình từ Emacs và không đợi đầu ra
- 18. Không hiểu đầu ra của chương trình C này
- 19. ngoại lệ com.google.zxing.NotFoundException xảy ra khi chương trình java lõi được thực thi?
- 20. dquote> kết quả của một thực hiện một chương trình trong shell linux
- 21. Ngôn ngữ lập trình web cho danh sách rất lớn?
- 22. Điều gì xảy ra khi chương trình java bắt đầu?
- 23. Hiệu quả nhân các ma trận rất lớn trong MATLAB
- 24. Tại sao đầu ra của tôi không hiển thị cho đến khi chương trình thoát?
- 25. gcc - viết và thực thi mã trong bss - thiết lập cờ cho phép
- 26. Đầu ra của chương trình đường ống đến ít hơn không hiển thị đầu ra của
- 27. Bàn điều khiển gỡ lỗi CDT Eclipse không hiển thị đầu ra chương trình
- 28. qmake thêm biên dịch với nhiều kết quả đầu ra cho mỗi tập tin
- 29. Thực thi tệp .jar từ một chương trình Java
- 30. Làm cách nào để tạo chương trình Java thực thi?
Mảng t [1 << 25] này chiếm khoảng 129 MB bộ nhớ, tôi nghĩ vậy. – Mithrandir