2011-06-21 38 views
8

Tôi đang viết một ứng dụng khá phức tạp, sử dụng nhiều container STL. Ứng dụng này có một phần nhạy cảm, hiệu suất tương đối đơn giản, lặp lại qua nhiều số std::map và được thực thi hàng ngàn lần. Thử nghiệm đã được hiển thị so với việc biên dịch với các trình vòng lặp đã chọn bị vô hiệu hóa (_SECURE_SCL được đặt thành 0) dẫn đến tăng tốc gần gấp 2 lần của toàn bộ chương trình, tập trung hoàn toàn vào phần này.Chọn lọc vô hiệu hóa các trình vòng lặp đã kiểm tra

Tuy nhiên, tôi không thể biên dịch ứng dụng với _SECURE_SCL được đặt thành 0 vì cần liên kết với các thư viện được biên dịch với _SECURE_SCL bật và trộn _SECURE_SCL cài đặt dẫn đến sự cố. Ngoài ra, tôi thấy nó khá ngớ ngẩn khi sử dụng các trình vòng lặp không được kiểm soát trong toàn bộ ứng dụng, khi tất cả các bit nhạy cảm hiệu suất xảy ra trong một màn hình mã duy nhất. Điều đó tương đương với việc vứt bỏ đứa bé bằng nước tắm.

Tôi có những lựa chọn nào để chọn sử dụng các trình vòng lặp không được kiểm tra cho mã/vùng chứa nhạy cảm với hiệu suất trong khi vẫn duy trì tính tương thích với các thư viện được biên dịch với các trình vòng lặp đã kiểm tra?

+0

Thanks for the help định dạng! – drxzcl

+0

Rất vui được giúp đỡ. Một câu hỏi hay nên nhìn tốt! –

Trả lời

4

này làm việc cho tôi:

vector<BYTE> v; 
vector<BYTE>::iterator i; 
vector<BYTE>::iterator::_Unchecked_type ui; 

i = v.end(); 
ui = i._Unchecked(); 

ui++; 
+0

Nó hoạt động tuyệt vời, bạn là anh hùng của tôi! Thật tuyệt vời khi tìm thông tin về những điều này thật khó khăn. – drxzcl

+0

Giải pháp này dường như không được hỗ trợ trong VC9/VS2008, điều này có đúng không? – drxzcl

+1

Có, mã hóa được thực hiện trong VS2010. – nnn

6

Như bạn đã phát hiện ra, bạn không thể kết hợp mã sử dụng trình kiểm tra đã kiểm tra/không được kiểm tra, do đó, để sử dụng nó trong một phần mã của bạn, bạn cần cung cấp phần đó giao diện không yêu cầu chuyển container và iterators. (Lưu ý rằng điều này kéo dài đến std::string.)
Và tất nhiên bạn sẽ phải đặt mã đó vào tệp thực thi của riêng nó (DLL). Tất nhiên, điều này yêu cầu không có quá nhiều cuộc gọi qua lại API đó.

Để an toàn, tôi thậm chí còn cân nhắc đưa phần đó vào một DLL có giao diện C.

+0

Cảm ơn câu trả lời của bạn. Đó không phải là những gì tôi hy vọng được nghe, nhưng nó có ý nghĩa. Điều gì về việc sử dụng các container từ một triển khai STL khác nhau? – drxzcl

+0

@Ranieri: Cùng một nỗi đau: _very_ có khả năng sẽ không hoạt động. – sbi

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