Đây là trong C++ trên CentOS 64bit sử dụng G ++ 4.1.2.new [] không giảm bộ nhớ còn trống cho đến khi được điền
Chúng tôi đang viết một ứng dụng thử nghiệm để tải lên mức sử dụng bộ nhớ trên một hệ thống bằng n Gigabyte. Ý tưởng được rằng tải hệ thống tổng thể được giám sát thông qua SNMP vv Vì vậy, đây chỉ là một cách để thực hiện giám sát.
Những gì chúng ta đã nhìn thấy tuy nhiên là chỉ đơn giản là thực hiện:
char* p = new char[1000000000];
không ảnh hưởng đến bộ nhớ sử dụng như trình bày trong một trong hai đầu hoặc miễn phí -m
Việc phân bổ bộ nhớ chỉ dường như trở thành " thực "khi bộ nhớ được ghi vào:
memcpy(p, 'a', 1000000000); //shows an increase in mem usage of 1GB
Nhưng chúng ta phải ghi vào tất cả bộ nhớ, chỉ cần viết vào phần tử đầu tiên sẽ không làm tăng bộ nhớ đã sử dụng:
p[0] = 'a'; //does not show an increase of 1GB.
Điều này có bình thường, bộ nhớ thực sự được phân bổ đầy đủ chưa? Tôi không chắc đó có phải là công cụ chúng tôi đang sử dụng (top và free -m) đang hiển thị các giá trị không đúng hay liệu có cái gì đó thông minh đang diễn ra trong trình biên dịch hay trong thời gian chạy và/hoặc hạt nhân.
Hành vi này được nhìn thấy ngay cả trong bản dựng gỡ lỗi có tối ưu hóa bị tắt.
Đó là sự hiểu biết của tôi rằng một [] mới đã cấp phát bộ nhớ ngay lập tức. Thời gian chạy C++ có làm chậm trễ sự phân bổ thực sự này cho đến sau này khi nó được truy cập hay không. Trong trường hợp đó, có thể trì hoãn ngoại lệ bộ nhớ cho đến khi phân bổ bộ nhớ thực sự cho đến khi bộ nhớ được truy cập?
Vì nó không phải là một vấn đề đối với chúng tôi, nhưng nó sẽ là tốt đẹp để biết lý do tại sao điều này xảy ra theo cách của nó!
Chúc mừng!
Edit:
Tôi không muốn biết về cách chúng tôi nên sử dụng Vectors, đây không phải OO/C++/cách hiện làm việc vv vv Tôi chỉ muốn biết tại sao điều này là xảy ra theo cách của nó, thay vì có những gợi ý cho những cách khác để thử nó.
Điều này! 1 cho câu trả lời đúng. –