2013-03-14 24 views
6

Đối với một chương trình được viết bằng C++, tôi cần hai mảng dây lớn chứa dữ liệu.C++ (gcc/g ++) Hai mảng lớn các chuỗi cực kỳ dài để biên dịch

Chúng được định nghĩa trong một tập tin tiêu đề như sau:

#include <string> 
static const string strdataA[30000]={"this is the first line of the data", 
    "the second line of data", 
    "other stuff in the third line", 

xuống

"last line."}; 
//second array strings 
static const string strdataB[60000]={"this is the first line of the data", 
    "the second line of data", 
    "other stuff in the third line", 

xuống

"last line."}; 

Nhưng khi tôi biên dịch này với g ++, phải mất rất từ lâu tôi chưa thấy nó hoàn thành. Nó cũng sử dụng khoảng hai GB bộ nhớ ảo. Vì vậy, tôi nhận xét ra strdataB [], và sau đó chương trình đã biên dịch, nhưng vẫn còn sau một thời gian dài. Việc thực thi chỉ khoảng 8 Mb và làm việc tốt.

Tôi có thể làm gì để tăng tốc quá trình biên dịch? Tôi không quan tâm nếu tôi phải thay đổi mã, nhưng tôi không muốn sử dụng một tập tin bên ngoài để tải từ. Tôi muốn một mảng vì nó hoạt động rất tốt cho tôi bên trong chương trình.

Tôi đọc trên mạng ở đâu đó rằng "const tĩnh" nên làm các trick, nhưng tôi đã học được bằng kinh nghiệm mà nó không.

Cảm ơn bạn rất nhiều vì đã đề xuất!

+0

Bạn đang nói về bao nhiêu dòng? Có thực sự 30.000 và 60.000 dây trong nguồn của bạn? –

+1

Tôi cho rằng chúng nằm trong tệp nguồn chứ không phải tệp tiêu đề. –

+0

Bạn nhận ra rằng bộ nạp phải làm về cơ bản giống như bạn sẽ làm nếu bạn nạp các chuỗi từ một tệp bên ngoài? –

Trả lời

6

Bạn không nên sử dụng std::string cho điều đó. Sử dụng thay vì đồng bằng cũ const char*:

const char * const strdataA[30000] = { 
    "one", 
    "two", 
    //... 
}; 

Từ khóa static không được tạo nên sự khác biệt ở đây.

Bằng cách này, các chuỗi tự sẽ được lưu trữ trong phần dữ liệu chỉ đọc dưới dạng các chữ đơn giản và bản thân mảng sẽ đơn giản là một mảng con trỏ. Ngoài ra, bạn tránh chạy các constructor chuỗi/destructors khi chạy.

+0

Điều này đã thực sự lừa, nó bây giờ biên dịch trong chớp mắt. Cảm ơn! –

3

Tôi tin rằng đây là những vấn đề đã biết trong GCC. Bạn không nói bạn đang sử dụng phiên bản GCC nào, có lẽ bạn nên thử với bản phát hành ổn định mới nhất của GCC, để xem nó có làm hay không cải thiện mọi thứ.

Có thể bạn không nên giữ tất cả chuỗi của mình trong mã nguồn. Bạn có lẽ nên tải chúng từ tập tin bên ngoài lúc khởi động hoặc như vậy.

+0

Đồng ý, bằng cách giữ các chuỗi bên ngoài và nạp lúc khởi động chương trình dễ dàng hơn nhiều để sửa đổi . Điều này đòi hỏi phải sửa đổi mã để sửa lỗi chính tả trong một chuỗi. –

+0

@ Chris.Stover Nói chung, tôi đồng ý với cả hai bạn. Tuy nhiên, nếu ví dụ bạn đang lưu trữ lược đồ của tệp cấu hình trong mã nguồn của bạn, thì tôi nghĩ đó là một ý tưởng tốt vì lý do bảo mật. –

+0

gcc --version cho "gcc (Ubuntu/Linaro 4.7.2-11lucid3) 4.7.2", phiên bản mới nhất tôi có thể nhận được. Các tệp/cơ sở dữ liệu bên ngoài có thể là một giải pháp, nhưng tôi chỉ muốn một tệp thực thi duy nhất, không phải một số tệp khác nhau. –

1

Tôi có thể làm gì để tăng tốc quá trình biên dịch?

const char* strdataA ... sẽ tăng tốc quá trình biên dịch. Bởi vì trong phiên bản hiện tại của bạn g ++ phải tạo danh sách lớn các lời gọi hàm tạo cho mỗi chuỗi đơn.

+0

Cảm ơn, đây là giải pháp thực sự. –

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