Bạn có thể đã xây dựng rất tối ưu.
Trên hầu hết các hệ thống hiện đại, gcc biết rằng malloc trả về một con trỏ không có biệt danh. Đó là để nói, nó sẽ không bao giờ trở lại cùng một con trỏ hai lần và nó sẽ không bao giờ trở lại một con trỏ bạn đã lưu 'sống' ở một nơi khác.
Tôi thấy điều này rất khó tưởng tượng, nhưng có thể là malloc đang được gọi một lần và giá trị trả về của nó được sử dụng hơn và hơn. Lý do là:
Nó biết bộ nhớ của bạn là một cửa hàng chết. tức là: bạn viết cho nó, nhưng nó không bao giờ được đọc từ đó. Con trỏ được biết là không được đặt bí danh vì vậy nó đã không thoát được để đọc từ một nơi khác, và nó không được đánh dấu dễ bay hơi. Vòng lặp for của bạn/có thể/bị vứt bỏ.
Tại thời điểm đó, nó chỉ có thể sử dụng cùng một bộ nhớ hơn và hơn.
Bây giờ, đây là lý do tại sao tôi thấy khó tin: Chỉ cần gcc biết bao nhiêu về malloc? Malloc có thể có bất kỳ loại tác dụng phụ nào như tăng số lần gọi là 'toàn cầu' để 'vẽ căn phòng của tôi một màu xanh dương ngẫu nhiên'. Nó có vẻ thực sự kỳ lạ rằng nó sẽ thả các cuộc gọi và giả sử nó được side-hiệu ứng miễn phí. Địa ngục, 'malloc' có thể được thực hiện để trả về NULL mỗi 100 cuộc gọi (có thể không hoàn toàn để spec, nhưng ai là để nói).
Điều bạn KHÔNG làm là giải phóng nó thay cho bạn. Điều đó vượt xa những gì nó 'có thể' biết và vào lãnh thổ của 'làm những điều nó chỉ không được phép'. Bạn được phép để rò rỉ bộ nhớ, lame mặc dù nó có thể được.
2 điều sẽ hữu ích ở đây: 1) Biên dịch environmenet: đó là os, trình biên dịch và cờ dòng lệnh.
và 2) tháo gỡ nhị phân cuối cùng. (objdump hoặc từ trình biên dịch)
vì bộ nhớ được cấp phát cùng một lúc ngay từ đầu? –
@arasmussen Bên trong vòng lặp 'while'. –
Có lẽ trình biên dịch thấy rằng bạn không còn có một xử lý trên con trỏ đó (bởi vì bạn viết ptr mỗi lần) và dọn dẹp sau nó cho bạn? Hoặc có thể mất nhiều thời gian để chạy mười triệu lần lặp lại? –