Table of Contents
Giới thiệu:
Trong chương trình C, mỗi cuộc gọi qua qua đường dây giới thiệu chức năng trên: người biên dịch phải thúc đẩy lập luận trên chồng (hoặc gửi chúng trong bộ nhớ), nhảy qua cơ quan chức năng, thực hiện mã, rồi trở lại. Đối với chức năng nhỏ, thường xuyên đòi hỏi, chức năng này có thể chiếm ưu thế thời gian thực hiện, đặc biệt trong các vòng lặp có tính năng nghiêm trọng hoặc sâu sắc tổ. Những người biên dịch hiện đại phải cung cấp gợi ý rõ ràng để đạt được tốc độ tối đa. Một gợi ý như vậy là [FL: 0] từ khoá thường xuyên, mà người biên dịch có thể mời người dịch thay thế một chức năng của cơ quan riêng, gọi là kỹ thuật viên thay thế chức năng của cơ thể. [Fin], [Fin], dùng chức năng thay đổi chức năng thay thế, và cải thiện hiệu quả hơn.
Chủ nghĩa cơ khí nằm sau các hàm trực tiếp
Một chức năng trực tiếp được tuyên bố bằng từ khoá . Giá trị này không ra lệnh trình biên dịch liên tiếp. Bộ biên dịch có thể bỏ qua chức năng này để dùng chức năng quá lớn, đệ quy trình, hoặc khi mức tối ưu hoá là thấp. Trong trường hợp C99 và sau đó, các ngữ pháp của đã được làm sáng tỏ: một chức năng được định nghĩa với [FL:] trong tập tin đầu trang có thể được bao gồm trong nhiều đơn vị dịch, không có lỗi hoặc liên kết, được cung cấp định nghĩa bên ngoài. Tính năng này thường có kết hợp với một [FT]. F: F. F. F.]
- [FLT: 0] Trực tiếp:) Chức năng có liên kết nội bộ; mỗi đơn vị dịch có bản riêng. Đây là cách tiếp cận an toàn nhất và dễ xách nhất cho các chức năng trợ giúp nhỏ được định nghĩa trong phần đầu.
- [FLT: 0] Liên kết trực tiếp (C99): Định nghĩa trực tiếp ) cho cơ thể để chỉ đường, nhưng phải có định nghĩa riêng biệt (thường là trong tập tin .c). Trong C11 và sau đó, hành vi này được hòa hợp.
- [FLT: 0] Inline không có tĩnh hoặc extern:[FLT: 1] Vào C99, điều này tương tự như đường dẫn bên ngoài; trong C11, chỉ cần định nghĩa bên ngoài nếu chức năng không được gọi theo mạch. Thực tế, [FLT: 6) được ưu tiên cho hầu hết trường hợp sử dụng.
[FLT: 0] Hiểu rõ: Trong khi trình biên dịch không phải là một bữa ăn trưa miễn phí. Trình biên dịch phân tích giá trị- độc quyền: chèn một chức năng vào mỗi nơi gọi tăng kích cỡ mã (code bloat), mà có thể giảm hiệu suất bộ nhớ tạm. Do đó, nội dung là tốt nhất dành riêng cho nhỏ, thường được gọi là chức năng.
Khi trực tiếp hàm hiện lên: Dùng trường hợp và thực hành tốt nhất
Các hoạt động toán học nhỏ
Những chức năng thực hiện số học cơ bản — chẳng hạn như tính một hình vuông, kẹp một giá trị hoặc thử một dấu hiệu — là những ứng cử viên chính.
static inline int clamp(int value, int low, int high) {
return (value < low) ? low : (value > high) ? high : value;
}
Hàm tham khảo và tạo mạch trong cấu trúc dữ liệu
Các mẫu theo hướng đối tượng trong C thường sử dụng nhà thu và thiết lập để tóm tắt dữ liệu. Nếu không nêu ra, các chức năng nhỏ hơn này thêm đầu không cần thiết:
typedef struct {
int x, y;
} Point;
static inline int point_get_x(const Point *p) {
return p->x;
}
static inline void point_set_x(Point *p, int x) {
p->x = x;
}
Hệ thống nhúng và mã thời gian thực
Trong môi trường có khoảng không gian bị hạn chế và các yêu cầu xác định thời gian, các chức năng nội bộ loại bỏ nhu cầu đẩy/g khung, giảm cả độ nhạy và bộ nhớ. Tuy nhiên, kích cỡ mã phải được theo dõi cẩn thận trên bộ điều khiển vi bộ nhớ được đào tạo.
Khi không để Inline
- Chức năng đăng ký:) Trong khi trình bày một chức năng 100+ tại nhiều nơi gọi sẽ bùng nổ chương trình nhị phân và rất có thể hiệu suất bị giảm do áp lực của bộ nhớ tạm.
- Các chức năng đệ quy: Không thể hoàn toàn liên kết (mặc dù trình biên dịch có thể mở ra vài cấp).
- Các chức năng có vòng lặp: [FLT: 1).
- Các chức năng được gọi là Giá trị trên đầu là không đáng kể nếu chức năng được gọi thường xuyên; chỉ giới thiệu khoảng trống.
Hàm trực tiếp tương ứng với Macros: Một ví dụ cụ thể
Trước khi từ khoá là chuẩn, lập trình viên C dùng vĩ mô ( để đạt được "inline" — nhưng vĩ mô là những văn bản thay thế, không phải chức năng.
- an toàn kiểu: Macros bỏ qua các kiểu. vĩ mô đánh giá các đối số nhiều lần, dẫn đến các hiệu ứng phụ nguy hiểm khi dùng với các từ như .
- Thực hiện: Macros biến mất trong quá trình xử lý; gỡ lỗi không thể bước vào chúng.
- Những lời tuyên bố đại diện:) vĩ mô đa phương trình yêu cầu làm việc một cách xấu xí (v. g., .
- Name
Các chức năng trực tiếp khắc phục tất cả các vấn đề này: chúng là chức năng đúng với việc kiểm tra, kiểm tra và đánh giá an toàn về ứng dụng (FLT:1) — nhưng C11 và C23 [FL:15] đề xuất đang giảm khoảng cách đó.
Mô- đun:) Để áp dụng chức năng trên vĩ mô, cần dùng các hàm số phù hợp với chức năng ký hiệu. Chỉ dự trữ vĩ lệnh cho hằng số đơn giản hoặc dán hiệu.
Những gương thực tiễn: Hàm trực tiếp trong hành động
Ví dụ 1: Hình vuông (đã cung cấp)
static inline int square(int x) {
return x * x;
}
Người biên dịch rất có thể sẽ không phát ra chỉ dẫn gọi; đoạn mã trở nên ở mỗi nơi gọi.
Thí dụ 2: Kiểm tra xem tính cách có phải là tính cách hay không
static inline int is_digit(char c) {
return c >= '0' && c <= '9';
}
Ví dụ 3: Min/Max nhanh (Không có vĩ lệnh)
static inline int imax(int a, int b) {
return (a > b) ? a : b;
}
Khác với phiên bản vĩ mô, điều này đánh giá và chính xác một lần, tránh những rủi ro tăng gấp đôi.
Ví dụ 4: Thao tác Bit (các thay đổi hay đổi byte)
static inline uint16_t swap_bytes(uint16_t x) {
return (x << 8) | (x >> 8);
}
Chương trình này biên dịch một hướng dẫn trên ARM, hoặc quay trên x86 khi được in thẳng.
Bộ biên dịch và từ khoá inline
Từ khoá chỉ là một yếu tố trong quyết định biên dịch của một trình biên dịch. Phần lớn các trình biên dịch có cờ- dòng lệnh kiểm soát tính hung hăng:
- cờ ) ) cho phép tính toán vừa phải; hiệu lực mạnh hơn. Cờ có thể được bật rõ ràng. Để hiệu lực một chức năng đặc trưng bất kể bộ biên dịch, hãy dùng với hoặc cao hơn.
- ) từ khoá có sẵn, nhưng nó không bảo đảm là người biên dịch có thể vẫn từ chối một số chức năng nào đó).
Ví dụ với thuộc tính GCC:
static inline __attribute__((always_inline)) int triple(int x) {
return x * 3;
}
Để xác nhận mã hiệu suất, cần kiểm tra các tập hợp đã tạo (v. d., với [FCC:33] hoặc để xác nhận rằng đã có. Những người biên dịch hiện đại có thể không đánh dấu ở mức tối ưu cao, và ngược lại có thể bỏ qua cho những chức năng này sẽ gây ra sự tăng trưởng quá mức.
Va chạm tiềm năng: Mã đốm và kích cỡ nhị phân
Để tóm tắt mỗi cuộc gọi của một hàm được dùng ở nhiều nơi, có thể tăng đáng kể kích cỡ của đoạn văn. Điều này đặc biệt khó khăn cho:
- Các chức năng trong phần đầu của các phần mềm phát triển thành mỗi đơn vị dịch thuật, có khả năng nhân mã.
- Hệ thống lọc: Flash và RAM bị hạn chế. Một chức năng 10 byte được dùng ở 1000 nơi thêm gần 10KB mã.
- Bộ nhớ tạm hướng dẫn:) bộ nhớ tạm lớn hơn có thể gây ra sự mất bộ nhớ tạm nhiều hơn, làm chậm toàn bộ chương trình.
Để giảm thiểu mã số, hãy dùng chỉ cho các chức năng thật sự nhỏ (thường là 1–5 phát âm). Dùng phân tích viên để nhận diện các chức năng nóng trước khi mù quáng. đo thời gian thực hiện và kích cỡ nhị phân.
Hàm trực tiếp qua tiêu chuẩn C
Từ khoá [FLT: 38] được mở ra [FLT:] C99 [FLT: 1] [FLT:] [FLT:] và rõ ràng hơn nữa trong [FLT:]] [FLT:]] [FLT:]]] [FLT:]] [FLT:]]] [FLTT:]]] [FLTTTTT:5]]]]]]. C23 giữ nguyên ngữ ngữ ngữ này với một số khác nhau. Sự khác biệt giữa định nghĩa "inline" và "exline" (sự hiểu biết về định nghĩa thời hiện đại] gây ra sự nhầm lẫn. Trong phần lớn các dự án [FL: 4], đoạn này là chỉ có các dấu hiệu quả với các tiêu chuẩn C và C.99.
Nếu bạn phải hỗ trợ các biên dịch viên tiền phân loại (rất hiếm), bạn phải quay trở lại vĩ mô hoặc chỉ thực hiện đầu trang. Nếu không, hãy ôm lấy như một thay thế di động và kiểu an toàn.
Kết luận: Một công cụ chiến lược trong công cụ của kỹ sư trình diễn
Chức năng trực tiếp là một tính năng chín chắn, được xác định rõ ràng của ngôn ngữ C, khi áp dụng một cách hợp pháp, có thể mang lại sự cải tiến tốc độ cân bằng bằng bằng cách loại bỏ chức năng gọi trên và hiệu chỉnh tối ưu chức năng. chúng vượt trội hơn với vĩ mô trong hầu hết các bối cảnh hiện đại. chìa khóa là giới hạn sử dụng chức năng nhỏ, nóng và kiểm tra kết quả với việc phân tích và lắp ráp. kết hợp với lá cờ biên dịch thích hợp, các chức năng làm cho các mã C đều nhanh và duy trì được — một kết hợp hiếm trong trình đơn thấp.
Để đọc thêm, hãy tham khảo ý kiến tài liệu về các chức năng liên tiếp ) và ) ) . Để phân tích hiệu suất thực tế , [FLT:] này [FLT:] tìm kiếm trong chi tiết đánh giá.