2011-12-20 34 views
6

Tôi đang sử dụng Windows 7 Pro 64 bit và Visual Studio 2010 Pro.Tại sao tôi có thể sử dụng bộ đệm lớn làm vectơ nhưng không có bộ đệm mới trên Windows?

Tôi đang cố gắng phân bổ và sử dụng bộ đệm lớn hơn 4 GB (để thu thập dữ liệu tốc độ dữ liệu cao).

Phân bổ và ghi bộ đệm dưới dạng vectơ byte hoạt động tốt. Phân bổ bộ đệm như một mảng các byte hoạt động tốt, nhưng việc ghi vào mảng đó sẽ bị treo nhanh chóng. (Tin nhắn cuối cùng được in là "đệm được cấp phát".)

Nhận xét phần vectơ không khắc phục được sự cố.

Sau đây là chương trình thử nghiệm của tôi:

#include <iostream> 
#include <vector> 
#include <BaseTsd.h> 

using namespace std; 

int main() { 
    const ULONG64 BUF_SIZE = 4 * 1024ULL * 1024ULL * 1024ULL; 

    { 
    vector<unsigned __int8> v(BUF_SIZE); 
    cout << "vector allocated" << endl; 
    for (ULONG64 i = 0; i < BUF_SIZE; ++i) { 
     v[i] = 0xff; 
    } 
    cout << "vector written" << endl; 
    } 

    { 
    unsigned __int8* buffer = new unsigned __int8[BUF_SIZE]; 
    cout << "buffer allocated" << endl; 
    for (ULONG64 i = 0; i < BUF_SIZE; ++i) { 
     buffer[i] = 0xff; 
    } 
    cout << "buffer written" << endl; 
    delete[] buffer; 
    } 

    return 0; 
} 

UPDATE: Tôi tin rằng đây là một lỗi biên dịch. Xem ở đây: http://connect.microsoft.com/VisualStudio/feedback/details/553756/invalid-check-for-maximum-array-size-in-x64-compiler-c2148

+0

Tôi đang sử dụng trình biên dịch 64 bit, bằng cách này, và các kết xuất/tiêu đề hiển thị '8664 máy (x64)' và 'Ứng dụng có thể xử lý các địa chỉ lớn (> 2GB)'. –

+0

Liệu bộ đệm 'trông giống như một con trỏ hợp lý sau khi phân bổ? Tại những gì 'i' nó sụp đổ? – sth

+0

sau khi bạn phân bổ véc tơ, bạn có thể in ra 'v.size()' để xác nhận không có biến nào bị cắt ngắn trên đường đi không? –

Trả lời

1

Tôi chỉ cố gắng biên dịch mã được với VS2010 Pro (phiên bản 64-bit), và trình biên dịch tạo ra một C2148 error cho new gọi:

error C2148: total size of array must not exceed 0x7fffffff bytes 

Tôi biên dịch nó từ lệnh sau khi chạy vcvarsx86_amd64.bat. Có vẻ như là limit given here có thể bằng cách nào đó sẽ được phát. Thay đổi new thành [BUF_SIZE-1] cho phép nó biên dịch và chạy (mặc dù vẫn lớn hơn số 0x7fffffff được thảo luận trong các liên kết đó).

+0

Tôi tin rằng bạn không thực hiện bản dựng 64 bit. Tôi đang biên dịch bằng cách sử dụng cl.exe từ dấu nhắc lệnh 64 bit, nhưng bạn cũng có thể tạo một Nền tảng Giải pháp x64 từ IDE. –

+0

@JamesMcNellis: Thật vậy. Tôi cũng đang bối rối về điều đó. Có vẻ như có thể có một lỗi trình biên dịch (nhưng mỗi khi tôi nghĩ rằng, nó bằng cách nào đó hóa ra lại là thứ tôi đã nói lên hoặc diễn giải sai). –

+0

Bạn có thể xác nhận rằng tệp thực thi của bạn là thực thi 64 bit bằng cách chạy dumpbin/headers trên nó từ dấu nhắc lệnh Visual Studio và đọc một vài dòng đầu tiên. –

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