2016-04-30 14 views
7

Tìm kiếm môi trường C++ cụ thể (trình biên dịch, hệ điều hành, phần cứng, v.v.) mà không có thư viện chuẩn (ví dụ: "x phiên bản gcc cho Nintendo 3DS")Môi trường C++ nào được sử dụng tích cực không hỗ trợ (hầu hết, nếu không phải tất cả) của thư viện chuẩn?

Một số thư viện C++ như Box2D hoặc TinyXML2 sử dụng uber-portable rất ít thư viện chuẩn, nếu có. Tuy nhiên, tôi hoàn toàn không hiểu cách tiếp cận này. Môi trường C++ nào được sử dụng tích cực không hỗ trợ (hầu hết, nếu không phải tất cả) của thư viện chuẩn?

+1

Những người thiết kế cho môi trường nhúng đôi khi tránh STL. Có liên quan: http://stackoverflow.com/questions/2226252/embedded-c-to-use-stl-or-not – computerfreaker

+0

@computerfreaker Đúng, nhưng tôi quan tâm đến các thư viện nhằm mục đích * hỗ trợ * các hệ thống nhúng, nhưng không gây thiệt hại cho nền tảng máy tính để bàn hỗ trợ hoặc tương tự. – JesseTG

+0

Ngành công nghiệp trò chơi đang lo lắng về hiệu suất hồi quy gây ra bởi phân bổ đống. Họ thường tránh sử dụng thư viện chuẩn. Và chúng tôi đang nói ở đây về chi phí nhỏ như phân bổ một trong con trỏ chia sẻ cho số ref .. – Alex

Trả lời

-3

Câu trả lời đơn giản là khi bạn chọn không bao gồm các gói STL.

Với hầu hết IDE nếu dự án của bạn không có #include <package_name> mục đang gọi đến STL, thì STL không được bao gồm trong thời gian biên dịch.

Mặc dù có thể có những trường hợp bạn cần phải đặc biệt loại trừ STL qua IDE/biên dịch

Một trong những lý do lớn để tránh STL là để giảm kích thước tập tin biên soạn thức.

+1

Tôi hỏi về môi trường C++ cụ thể (trình biên dịch, hệ điều hành, phần cứng, v.v.) mà không có thư viện chuẩn (ví dụ: "phiên bản x của gcc cho Nintendo 3DS"). – JesseTG

5

Hỗ trợ thư viện chuẩn C++ có thể khác nhau giữa các nhà cung cấp trình biên dịch khác nhau và thậm chí giữa các phiên bản khác nhau của cùng một trình biên dịch. Điều này đặc biệt đúng trên các hệ thống nhúng và trên các bảng điều khiển khác nhau.

Bằng "thay đổi", tôi có nghĩa là có thể có lỗi, các tính năng được triển khai khác hoặc thậm chí thiếu các tính năng. Ví dụ: Android có triển khai thực hiện thư viện chuẩn C++ rất minimal.

Có nhiều trình biên dịch C++ kỳ lạ và tuyệt vời trên mạng; nó không chỉ là GCC và Visual Studio. Nintendo ví dụ sử dụng trình biên dịch Green Hills.

Vì vậy, do có nhiều trình biên dịch khác nhau, cách tốt nhất để hỗ trợ một số lượng lớn trong số đó là chỉ tuân theo các tính năng được cung cấp bởi thư viện chuẩn C. Nhiều thư viện di động thậm chí tránh sử dụng các tính năng C++ hiện đại hơn.

1

Các môi trường duy nhất mà tôi có thể nghĩ là các môi trường độc lập (hệ điều hành và các chương trình nhúng đơn lẻ). Tất nhiên, một số nhà phát triển tích cực tránh sử dụng STL, nhưng đây là một quyết định thiết kế hơn là thiếu sự hỗ trợ trong môi trường. Tôi tin rằng rào cản lớn nhất trong các môi trường hạn chế này là hỗ trợ ngoại lệ (nhiều chức năng STL ném). Để có được hỗ trợ cho những người này phải cổng một C + + ABI và thư giãn thư giãn (để làm stack thư giãn và goto để nắm bắt tuyên bố). Không có gì ngăn cản một từ việc thực hiện các bit được yêu cầu này, nhưng nó phụ thuộc nhiều hơn, điều này rõ ràng dẫn đến sưng lên chỉ để hỗ trợ cơ bản cho một cái gì đó giống như các danh sách liên kết. Để chuyển ABI, hãy xem the OSDEV wiki entry.

Có các phụ thuộc khác cho các tiêu chuẩn C++ mới hơn (C++ 11 trở đi). Tôi có thể tưởng tượng std::thread yêu cầu triển khai luồng như pthreads. std::chrono có thể sẽ cần một số lớp trung gian được triển khai giữa thời gian thư viện chuẩn và C. Có thể có nhiều chức năng STL yêu cầu hỗ trợ hệ điều hành.

Mẫu Mẫu một phần của STL cũng khá quan trọng. Các mẫu thường tăng kích thước nhị phân cuối cùng khá đáng kể. Trong trường hợp của std::list chẳng hạn, std::list<MyClass1>std::list<MyClass2> sẽ dẫn đến việc chuyên môn hóa hai vùng chứa khác nhau. Mã sẽ trông rất giống nhau nhưng sẽ được nhân bản để xử lý loại phần tử cụ thể của chúng.Việc triển khai danh sách liên kết khác thường sử dụng một con trỏ void để liên kết các nút và sau đó đưa nó vào lớp thích hợp khi được yêu cầu. Theo cách này, có một lớp danh sách được khởi tạo cho ints, char *, MyClass1, vv Kích thước nhị phân tăng thường không thể chấp nhận được trong môi trường nhúng, nhưng cần lưu ý rằng nó cũng trở thành một vấn đề khi LibA triển khai LibA :: LinkedList và LibB LibB :: LinkedList.

Chất lượng triển khai đã trở thành ít vấn đề hơn trong những ngày này. Cũng rất hữu ích khi GCC nhắm vào nhiều kiến ​​trúc để các chuẩn trình biên dịch mới có sẵn (như trên, bạn vẫn cần phải chuyển một số chức năng của STL). GCC lâu đời nhất mà tôi đã sử dụng là GCC v4.3 hoặc một cái gì đó tương tự cho một thiết bị PowerPC được nhúng. Điều đó đã được phát hành vào năm 2010 và có hỗ trợ STL đầy đủ. Tóm lại, sự cần thiết cho các thư viện với một tập hợp chức năng rất tập trung vẫn có thể giúp, nhưng theo ý kiến ​​của tôi, họ giảm bao nhiêu nền tảng dự án của bạn nhắm mục tiêu nếu chúng cung cấp các chức năng bọc hành vi phụ thuộc vào hệ điều hành. Đối với cấu trúc dữ liệu thô và hỗ trợ thuật toán, bạn không thể đi sai. Cuối cùng, bạn phải nhắm mục tiêu một số tập con của nền tảng. Trong C++ 11, tôi tin rằng bạn nhắm mục tiêu 99% các hệ điều hành máy tính để bàn/máy chủ được sử dụng và 99% các thiết bị Linux nhúng. Như được nêu bật trong một câu trả lời khác, Android đã là một vấn đề nhưng this page dường như làm nổi bật để có được tất cả các bit cần thiết để có được một môi trường thực sự hiện đại.

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