2012-12-13 29 views

Trả lời

12

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.

+0

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. –

+0

@brianbeuning Nó là khá rõ ràng, nhưng vẫn được bổ sung cho đầy đủ. – axiom

+0

Đ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

Các vấn đề liên quan