Có lẽ một cái gì đó tương tự đã được hỏi, và chắc chắn, đó là một nitpick ...constexpr và khởi
tôi có một loạt các hằng số std::map
s để chuyển đổi giữa enum (class)
giá trị và std::string
cơ quan đại diện của họ (cả hai cách). Một người nào đó ở đây đã chỉ ra với tôi rằng những bản đồ này sẽ được khởi tạo trong thời gian chạy, khi mã khởi tạo khác được chạy, trước khi chương trình của tôi thực thi tất cả những thứ tốt. Điều này có nghĩa là các biểu thức liên tục sẽ tác động đến hiệu suất thời gian chạy, vì các bản đồ được xây dựng từ các cặp enum-string của chúng.
Như một ví dụ minh họa, đây là một ví dụ về một trong những tấm bản đồ:
enum class os
{
Windows,
Linux,
MacOSX
};
const map<string, os> os_map =
{ {"windows", os::Windows},
{"linux", os::Linux},
{"mac", os::MacOSX} };
const map<os, string> os_map_inverse =
{ {os::Windows, "windows"},
{os::Linux, "linux"},
{os::MacOSX, "mac"} };
C++ 11 constexpr
Sẽ có bất kỳ ảnh hưởng đến hiệu suất, hoặc là giả định của tôi về một thời gian chạy phạt khởi sai? Tôi nghĩ rằng một trình biên dịch có thể nhúng một container STL liên tục như dữ liệu thuần túy trong thực thi, nhưng dường như điều đó có thể không dễ dàng như tôi làm cho nó âm thanh?
Tại sao không bạn thử 'boost :: bimap' cho ánh xạ hai mặt giữa enum và biểu diễn chuỗi của nó? Ít có khả năng gây ra lỗi khi thêm các giá trị mới. – Xeo
Xeo: kéo Boost cho một thứ đơn giản như thế này? Không, cảm ơn, tôi phụ thuộc miễn phí, và thực sự muốn giữ nó theo cách đó;) ... Tôi thậm chí có thể thay thế bản đồ string-> enum bằng một 'unordered_map' và bản đồ chuỗi enum-> bằng một' vector '(giá trị enum không quan trọng, chúng chỉ đếm từng cái một) để thực hiện nếu điều đó có thể cải thiện được. 'boost :: bimap' sẽ hút so sánh :) – rubenvb
@rubenvb: Và [Boost.MultiIndex] (http://www.boost.org/libs/multi_index/) có thể làm chính xác điều đó, ngắn gọn hơn nhiều, với 0 trên không. Vui lòng không xem Tăng cường dưới dạng 'phụ thuộc'. – ildjarn