2009-11-03 33 views
22

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?

+0

http://kerneltrap.org/node/4705 – pmg

+0

trùng lặp? http://stackoverflow.com/questions/109710/likely-unlikely-macros-in-the-linux-kernel –

+0

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. –

Trả lời

40

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.

+1

Trong phần #else, chúng có nên đánh giá thành (x) và không rỗng không? –

+1

oops, tất nhiên là có. Đã chỉnh sửa – Tomas

+0

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? –

4

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ì đó một thực gcc feature

9

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.

+0

@Nikolai Cảm ơn bạn đã liên kết. –

+0

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 :) –

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