2009-03-15 40 views
7

Nội tuyến là gì?Chức năng nội tuyến

Nó được sử dụng để làm gì?

Bạn có thể in nội dung gì đó trong C# không?

+0

Cũng thấy câu hỏi này:

Trả lời

25

gì nó là

Trong các điều khoản của C và C++ bạn sử dụng các từ khoá inline nói với trình biên dịch để gọi một thói quen mà không có sự cần thiết của việc thúc đẩy thông số vào stack. Thay vào đó, hàm này có mã máy được chèn vào hàm mà nó được gọi. Điều này có thể tạo ra sự gia tăng đáng kể về hiệu suất trong các tình huống nhất định.

nguy hiểm

Những lợi ích tốc độ trong việc sử dụng "nội tuyến" giảm đáng kể kích thước của hàm inline tăng. Việc sử dụng quá mức có thể khiến chương trình chạy chậm hơn. Việc sắp xếp một hàm truy cập rất nhỏ thường sẽ làm giảm kích thước mã trong khi việc sắp xếp một hàm rất lớn có thể làm tăng đáng kể kích thước mã.

nội tuyến trong C#

Trong C# nội tuyến xảy ra ở cấp JIT trong đó trình biên dịch JIT làm cho các quyết định. Hiện tại không có cơ chế nào trong C# mà bạn có thể làm điều này một cách rõ ràng. Nếu bạn muốn biết trình biên dịch JIT đang làm gì thì bạn có thể gọi: System.Reflection.MethodBase.GetCurrentMethod().Name khi chạy. Nếu Method được inline, nó sẽ trả về tên của người gọi.

Trong C# bạn không thể ép buộc phương thức nội tuyến nhưng bạn có thể bắt buộc phương thức không. Nếu bạn thực sự cần quyền truy cập vào một callstack cụ thể và bạn cần xóa nội tuyến, bạn có thể sử dụng: MethodImplAttribute với MethodImplOptions.NoInlining. Ngoài ra, nếu một phương thức được khai báo là ảo thì nó cũng sẽ không được JIT gạch chân. Lý do đằng sau điều này là mục tiêu cuối cùng của cuộc gọi là không rõ.

More on inlining

+3

Để được chính xác hơn, bạn don 't' nói với trình biên dịch, "bạn" thực hiện một gợi ý cho trình biên dịch mà nó có thể hoặc có thể không chú ý. " –

1

Để định nghĩa và thảo luận về nội tuyến, see this question.

Trong C# bạn không cần hướng dẫn trình biên dịch hoặc thời gian chạy nội dòng vì thời gian chạy sẽ tự động thực hiện.

P.S. Câu trả lời này cũng đúng cho Java.

1

nội tuyến là khi thay vì gọi một chức năng cụ thể, nội dung của các chức năng được thực hiện trực tiếp tại trang web của cuộc gọi. Lý do chính để làm điều này là nó loại bỏ các chi phí của việc gọi một hàm bằng cách chạy các nội dung hàm tại callite.

Nó được sử dụng làm kỹ thuật tối ưu hóa. Trong trường hợp của C#, nó thực sự phụ thuộc vào động cơ JIT CLR để thực hiện công việc. Khi chạy, khi biên dịch một phương thức, công cụ JIT sẽ sử dụng một heuristic để xác định xem một hàm inline có phù hợp không và sẽ là một tối ưu hóa có hiệu lực. Nếu vậy, nội tuyến sẽ được thực hiện.

Vance có một bài viết tuyệt vời về những gì JIT xem xét khi nội tuyến: http://blogs.msdn.com/vancem/archive/2008/08/19/to-inline-or-not-to-inline-that-is-the-question.aspx

Không có cách nào để buộc một nội tuyến trong C#. Ngôn ngữ không hỗ trợ cấu trúc này. Chủ yếu là bởi vì mọi người là những thẩm phán rất nghèo về những gì cần được tối ưu hóa. JITer là một thẩm phán tốt hơn nhiều.

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