Tôi đã xem 2 macro này trong mã nhân Linux. Tôi biết họ là hướng dẫn để trình biên dịch (gcc) để tối ưu hóa trong trường hợp phân nhánh. Câu hỏi của tôi là, chúng ta có thể sử dụng các macro này trong mã không gian người dùng không? Nó sẽ cung cấp cho bất kỳ tối ưu hóa? Bất kỳ ví dụ nào cũng sẽ rất hữu ích.Macro có thể có khả năng/không được sử dụng trong mã không gian người dùng?
Trả lời
Có họ có thể. In the Linux kernel, chúng được định nghĩa như
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
Các macro __builtin_expect là macro cụ GCC có sử dụng các dự báo chi nhánh; chúng cho bộ xử lý biết liệu điều kiện có khả năng đúng hay không, do đó bộ xử lý có thể tìm nạp trước các hướng dẫn về "mặt" chính xác của nhánh.
Bạn nên quấn định nghĩa trong một ifdef để đảm bảo biên soạn trên các trình biên dịch khác:
#ifdef __GNUC__
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
#else
#define likely(x) (x)
#define unlikely(x) (x)
#endif
Nó chắc chắn sẽ cung cấp cho bạn tối ưu nếu bạn sử dụng nó cho những dự đoán chi nhánh chính xác.
Trong phần #else, chúng có nên đánh giá thành (x) và không rỗng không? –
oops, tất nhiên là có. Đã chỉnh sửa – Tomas
tệp tiêu đề nào chứa định nghĩa này trong người dùng bao gồm các thư mục? –
Các khả năng() và không() macro là tên khá được định nghĩa trong tiêu đề hạt nhân cho một cái gì đó là một thực gcc feature
Hãy xem xét What Every Programmer Should Know About Memory trong "6.2.2 Tối ưu hóa cấp 1 Truy cập bộ nhớ cache hướng dẫn" - có phần chính xác về điều này.
@Nikolai Cảm ơn bạn đã liên kết. –
Không sao cả. Đây là một bài báo rất sáng suốt, ngay cả khi đọc lần thứ ba :) –
- 1. TThreadedQueue không có khả năng của nhiều người tiêu dùng?
- 2. Bạn có thể sử dụng khối mã làm đối số cho macro C không?
- 3. Có thể sử dụng cancan với hai lớp khả năng
- 4. Người dùng có thể bỏ qua sự khác biệt giữa macro và tích hợp không?
- 5. Nhập mã vùng người dùng vào không gian hạt nhân
- 6. Cách kiểm tra xem địa chỉ có thể đọc được trong ứng dụng không gian người dùng Linux
- 7. Các luồng Java có được tạo trong không gian người dùng hoặc không gian hạt nhân không?
- 8. Có thư viện xác thực người dùng được hỗ trợ mongodb cho người viết mã không?
- 9. Sử dụng GHC, cabal với GMP được cài đặt trong không gian người dùng
- 10. Trong C# Giao diện người dùng được mã hóa có cách để chờ kiểm soát có thể nhấp được
- 11. Có thể sử dụng biến MySql do người dùng định nghĩa trong .NET MySqlCommand không?
- 12. Có phải TestContext.Properties có thể sử dụng được không?
- 13. Rails 3 - Active_admin có thể sử dụng mô hình người dùng hiện tại không?
- 14. Nhiều người không có bàn trung gian - có thể không?
- 15. Phương pháp tiếp cận cơ sở dữ liệu người dùng CouchDB có khả thi cho người dùng có nhiều dữ liệu được chia sẻ không?
- 16. Có thể nào để xác thực người dùng khi kết nối websocket được sử dụng?
- 17. Mã di động cho người dùng không được sử dụngBộ khóa từ điển thông dụng (Cocoa)
- 18. Có bao nhiêu người dùng đồng thời có thể ứng dụng web được xây dựng trong xử lý Meteor.js?
- 19. Macro người dùng hợp lưu trực tuyến
- 20. Có thể vô hiệu hóa phương thức async được sử dụng trong điều khiển người dùng ASP.NET không?
- 21. Trình quản lý không khả dụng; Người dùng đã được đổi chỗ cho 'pet.Person'
- 22. TKinter có được sử dụng rộng rãi để xây dựng giao diện người dùng không?
- 23. Có thể tự động giải mã tệp người dùng thành Unicode không? [C#]
- 24. Trong Jinja2, làm cách nào tôi có thể sử dụng macro kết hợp với thẻ chặn?
- 25. Tôi có nên sử dụng hàm hoặc macro để xác thực đối số trong Clojure không?
- 26. Ruby có thể được sử dụng cho các ứng dụng Windows dựa trên giao diện người dùng không?
- 27. Tôi có thể sử dụng CPAN như một người dùng không phải root như thế nào?
- 28. Có thể sử dụng CSRF khi không có Cookie không?
- 29. Tôi có thể sử dụng `sysctl` để lấy danh sách quy trình với người dùng không?
- 30. Tôi có thể sử dụng macro được xác định trước nào để phát hiện tiếng kêu?
http://kerneltrap.org/node/4705 – pmg
trùng lặp? http://stackoverflow.com/questions/109710/likely-unlikely-macros-in-the-linux-kernel –
Tôi đã kiểm tra các bài đăng này, nhưng cả hai lại nói về những thứ liên quan đến hạt nhân. Tôi muốn biết liệu có thể sử dụng cùng một mã trong mã người dùng hay không. –