2010-05-09 26 views
5

Khi tôi nhập vào các foll. mã, tôi nhận được đầu ra như 1073741823.Tại sao tôi không thể dự trữ 1.000.000.000 trong véc tơ của mình?

#include <iostream> 
#include <vector> 
using namespace std; 
int main() 
{ 
    vector <int> v; 
    cout<<v.max_size(); 
    return 0; 
} 

Tuy nhiên khi tôi cố gắng để thay đổi kích thước vector để 1000000000, bởi v.resize(1000000000); chương trình ngừng thực hiện. Làm thế nào tôi có thể cho phép chương trình phân bổ bộ nhớ cần thiết, khi có vẻ như nó có thể?

Tôi đang sử dụng MinGW trong Windows 7. Tôi có RAM 2 GB. Có nên không? Trong trường hợp không thể, tôi không thể khai báo nó như là một mảng các số nguyên và lấy đi? BUt thậm chí điều đó không hoạt động.

Một điều nữa là, giả sử tôi sẽ sử dụng tệp (có thể dễ dàng xử lý nhiều dữ liệu). Làm cách nào để tôi đọc và ghi cùng lúc. Sử dụng fstream file("file.txt', ios::out | ios::in); không tạo tệp, ngay từ đầu. Nhưng giả sử tập tin tồn tại, tôi không thể sử dụng để đọc và viết đồng thời. những gì tôi có nghĩa là thế này: Hãy để nội dung của file được 111111 Sau đó, nếu tôi chạy: -

#include <fstream> 
#include <iostream> 
using namespace std; 
int main() 
{ 
    fstream file("file.txt",ios:in|ios::out); 
    char x; 
    while(file>>x) 
    { 
    file<<'0'; 
    } 
return 0; 
} 

nên không phải nội dung của tập tin hiện nay được 101010? Đọc một ký tự và sau đó ghi đè lên ký tự tiếp theo bằng 0? Hoặc trong trường hợp toàn bộ nội dung được đọc cùng một lúc vào một số bộ đệm, nên không có ít nhất một 0 trong tệp? 1111110? Nhưng nội dung vẫn không bị thay đổi. Vui lòng giải thích. Cảm ơn bạn.

+4

Chào mừng bạn đến với Stack Overflow! Đây là hai câu hỏi riêng biệt. Nói chung, bạn nên hỏi riêng họ. –

+3

Đây là hai câu hỏi rất khác nhau. Bạn có thể chia chúng thành hai bài viết câu hỏi không? – wilhelmtell

+0

Cảm ơn bạn. Tôi xin lỗi, Kể từ khi phân bổ bộ nhớ không hoạt động, tôi đã cố gắng làm điều tương tự, nhưng trong một tập tin, và có một bộ khác nhau của các lỗi đó. Vì vậy, tôi đặt các câu hỏi với nhau. Tôi chắc chắn sẽ hỏi họ một cách riêng biệt vào lần tới. – shreedhar

Trả lời

14
  1. Quy trình 32 bit chỉ có thể xử lý không gian địa chỉ 4GB cùng một lúc. Thông thường, nhiều không gian địa chỉ 4GB này được sử dụng để lập bản đồ các nội dung khác. Vector của bạn sẽ chiếm quá nhiều không gian địa chỉ liền kề (4 tỷ byte) mà không có khả năng có sẵn.

  2. Bạn nên memory map the file. Xem mmap.

+0

Thảo luận này: http://stackoverflow.com/questions/2791330/which-is-better-in-general-map-or-vector-in-c/2791491#2791491 có thể là mầm. – Clifford

+2

Địa chỉ không gian trên Win32 được giới hạn ở 2GiB. Linux nên được 3GiB tôi nghĩ. –

+1

@Vincent: cũng có 3GB chuyển đổi trên Windows, mặc dù 2GB là mặc định: http://technet.microsoft.com/en-us/library/bb124810%28EXCHG.65%29.aspx – sbk

0

Tuy nhiên khi tôi cố gắng để thay đổi kích thước vector để 1000000000, bởi v.resize (1000000000); chương trình ngừng thực thi. Làm thế nào tôi có thể kích hoạt chương trình để cấp phát bộ nhớ cần thiết, khi có vẻ như nó sẽ có thể?

Nó có thể phụ thuộc vào việc thực hiện C++ STL, nhưng hành động thay đổi kích thước thường khiến ứng dụng đặt trước nhiều hơn những gì bạn yêu cầu.

0

Số nguyên là bốn byte, vì vậy 1.000.000.000 số nguyên sẽ chiếm khoảng 3,72 GB.

+2

Không, nó sẽ mất (ít nhất) chính xác 4 ** GB ** hoặc vòng xoay 3.72 ** GiB **. Xem [tiền tố nhị phân] (http://en.wikipedia.org/wiki/Binary_prefix) để biết chi tiết. – fredoverflow

+9

@FredOverflow: Hơi khó hiểu! Nơi duy nhất tôi từng thấy thuật ngữ đó thường xuyên sử dụng là trên Wikipedia. Trong bối cảnh đó (nơi người đọc có thể không phải là một chuyên gia máy tính), nó phục vụ một mục đích hữu ích của việc định hướng, nhưng ở đây tôi nghĩ rằng tất cả chúng ta đều biết những gì ông có nghĩa là hoàn toàn rõ ràng. – Clifford

0

Bạn đang yêu cầu phân bổ một tỷ số nguyên trong chuỗi liên tiếp. Ngoài khó khăn trong việc tìm kiếm một không gian tiếp giáp khổng lồ như vậy, bạn chỉ đơn giản là không có không gian đó. Nhớ lại rằng một số nguyên trên một hệ thống 32 bit thông thường chiếm 32 bit hoặc 4 byte. Nhân số tiền đó với một tỷ và bạn vượt xa 2GB bạn có. Ngoài ra, std::vector được phép đặt trước số tiền bạn yêu cầu.

Đối với câu hỏi thứ hai, nếu cả hai bạn đọc và viết cùng một lúc với cùng một đối tượng fstream, hãy đảm bảo bạn seekg()seekp() trước khi đọc và viết.

+0

Làm cho tinh thần, nó không nên có thể phân bổ rất nhiều. Nhưng sau đó tại sao 'v.maxsize() 'cho phép tôi phân bổ nhiều hơn thế? – shreedhar

+0

Và liên quan đến seekg và seekp, tôi đã ấn tượng rằng, chỉ có một con trỏ tập tin cho cả đọc và viết? Nếu có hai, tôi có thể viết vào tập tin và sau đó đọc toàn bộ nội dung mà không sử dụng 'seekg (0)'? – shreedhar

+0

'vector :: max_size()' không "cho phép" bạn phân bổ nhiều như vậy. Nó chỉ cho bạn biết các giới hạn mà triển khai thư viện chuẩn của bạn áp đặt là gì. Cho dù phần cứng của bạn có thể đạt đến giới hạn này hay không thì đó là một câu chuyện khác. – wilhelmtell

1

Việc thực hiện STL tối đa sẽ đối phó với là một điều; số lượng bộ nhớ tối đa có sẵn từ hệ điều hành là một thứ khác; bạn đang đánh thứ hai.

Ví dụ: bạn có thể tạo một vectơ của nhiều yếu tố đó char. Dù bằng cách nào, không mong đợi hiệu suất phồng rộp trừ khi bạn có bộ nhớ vật lý nhiều (cộng với bất cứ điều gì hệ điều hành và bất cứ điều gì khác chạy nhu cầu); truy cập vào một vectơ như vậy sẽ không nghi ngờ gì dẫn đến việc làm hỏng đĩa nhiều lần khi bộ nhớ trang hệ thống vào và ra khỏi đĩa.

Bộ vi xử lý với không gian địa chỉ 32 bit (hoặc khi chạy hệ điều hành 32 bit bất kể không gian địa chỉ vật lý) chỉ có thể địa chỉ 4Gb (vật lý hoặc ảo), do đó có giới hạn kiến ​​trúc. Hơn nữa một số giới hạn của hệ điều hành không gian người dùng; ví dụ, không gian người dùng trong Win32 được cố định ở 2Gb. Các phiên bản khác nhau của Win64 giả tạo giới hạn không gian người dùng để cho phép Microsoft tính các mức giá khác nhau, vì vậy việc sử dụng Win64 không đảm bảo đủ dung lượng địa chỉ.

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