✨Hàm nội tuyến

Hàm nội tuyến

Trong khoa học máy tính, hàm nội tuyến (tiếng Anh: inline function) là một cấu trúc trong ngôn ngữ lập trình được sử dụng để đề nghị với chương trình biên dịch rằng một hàm cụ thể nào đó là đối tượng của việc khai triển nội tuyến (inline expansion); có nghĩa là, nó đề nghị rằng chương trình biên dịch nên chèn toàn bộ thân hàm vào trong từng ngữ cảnh, nơi hàm đó được sử dụng.

Động cơ

Khai triển nội tuyến thường được dùng để loại bỏ thời gian quá dụng (overhead) xảy ra khi gọi một hàm; kỹ thuật này thường được dùng cho các hàm thực thi thường xuyên, vì khi đó thời gian quá dụng chiếm phần đáng kể. Hàm nội tuyến còn có tác dụng giảm không gian bộ nhớ mà các hàm nhỏ chiếm chỗ, đồng thời cho phép các kỹ thuật tối ưu hoá (optimization) khác biến đổi mã.

Nếu không có hàm nội tuyến thì lập trình viên sẽ có rất ít hoặc không có quyền quyết định xem hàm nào được là hàm nội tuyến, hàm nào không; mà việc này sẽ hoàn toàn do trình biên dịch quyết định. Việc bổ sung khả năng điều khiển này cho phép lập trình viên khai thác các kiến thức đặc thù về chương trình ứng dụng, chẳng hạn những hàm thường xuyên được thực thi, để lựa chọn xem hàm nào cần là hàm nội tuyến. Tuy nhiên, nhiều trình biên dịch (chẳng hạn cho ngôn ngữ C++) giữ quyền quyết định cuối cùng về việc một hàm đã được lập trình đặt chế độ nội tuyến có thể thực sự được là một hàm nội tuyến hay không, quyết định này thường được dựa vào việc nội dung của hàm này có khả thi cho việc khai triển nội tuyến hay không.

Thêm nữa, trong một số ngôn ngữ, các hàm nội tuyến tương tác gần gũi với mô hình biên dịch (compilation model); chẳng hạn trong C++, một hàm nội tuyến phải được định nghĩa trong tất cả các môđun sử dụng hàm đó, trong khi đó chỉ cần định nghĩa các hàm thông thường trong một môđun mà thôi. Điều này cho phép biên dịch các môđun một cách độc lập với tất cả các môđun khác.

So sánh với macro

Theo truyền thống, trong các ngôn ngữ như C, việc khai triển nội tuyến được thực hiện ở mức mã nguồn bằng cách sử dụng các macro có tham số (parameterized macro). Việc sử dụng hàm nội tuyến mang lại một số lợi điểm so với cách tiếp cận truyền thống này:

  • Các lời gọi macro không thực hiện kiểm tra kiểu dữ liệu, và cũng không kiểm tra xem các tham đối (argument) có được định dạng đúng (well-formed) hay không, trong khi đó các lời gọi hàm thường thực hiện các kiểm tra này.
  • Do các macro của C chỉ thực hiện thay thế văn bản (textual substitution), điều này có thể dẫn tới các hiệu ứng phụ và sự không hiệu quả nằm ngoài dự tính, do việc đánh giá lại các tham đối và trật tự tính toán.
  • Lỗi biên dịch bên trong các macro thường rất khó hiểu, vì chúng là các lỗi trong phần mã đã được khai triển, chứ không phải phần mã do lập trình viên viết. (Lập trình viên có thể sẽ phải xem phần mã biên dịch sơ thảo của mã nguồn (pre-compile) để biết được lỗi xảy ra ở đâu.)
  • Có nhiều cấu trúc mà việc biểu diễn chúng bằng các macro là rất rắc rối hoặc không thể làm được, hoặc phải dùng đến những cú pháp hết sức khác biệt. Các hàm nội tuyến sử dụng cú pháp như các hàm thông thường, và có thể được chuyển thành nội tuyến hoặc bỏ chế độ nội tuyến tùy theo ý muốn một cách dễ dàng.
  • Thông tin tìm lỗi (debug) đối với mã nội tuyến thường hữu ích hơn thông tin dành cho mã macro đã được khai triển. Rất nhiều các bộ biên dịch còn khai triển nội tuyến một số các hàm đệ quy (recursive function) ; macro đệ quy thường là không hợp lệ.

Bjarne Stroustrup, người thiết kế C++, nhấn mạnh rằng nên tránh sử dụng macro mỗi khi có thể tránh được, và khuyến khích sử dụng rộng rãi các hàm nội tuyến.

Hỗ trợ của ngôn ngữ

C++, C99, và GNU C đều hỗ trợ hàm nội tuyến, song ANSI C (1990), phương ngữ phổ biến nhất của C trong thực tiễn, lại không hỗ trợ hàm nội tuyến. Trong ngôn ngữ lập trình ADA, hàm nội tuyến được sử dụng dưới hình thức của pragma. Đa số các ngôn ngữ khác, trong đó có Java và các ngôn ngữ lập trình hàm (functional languages), không cung cấp hàm nội tuyến nhưng lại thực hiện khai triển nội tuyến rất mạnh. Các trình biên dịch khác nhau có thể khác nhau ở độ phức tạp của các hàm mà chúng có khả năng khai triển nội tuyến. Các bộ biên dịch C++ chính thống như Microsoft Visual C++ và GCC (GNU Compiler Collection) có hỗ trợ một tùy chọn cho phép bộ biên dịch tự động biến mọi hàm có thể thành hàm nội tuyến, ngay cả khi các hàm này không được đánh dấu là hàm nội tuyến.

Một hàm nội tuyến có thể được viết trong C++ như sau: inline int max (int a, int b) { if (a > b) return a; else return b; }

a = max (x, y); // hiện tương đương với "a = (x > y ? x: y);"

Những vấn đề với các hàm nội tuyến

Bên cạnh những vấn đề liên quan đến khai triển nội tuyến nói chung, với vai trò một tính năng của ngôn ngữ, hàm nội tuyến có thể không đáng giá như người ta có thể hình dung, vì một số lý do sau:

  • Thông thường, để quyết định xem một hàm cụ thể nào đó có nên là hàm nội tuyến hay không, trình biên dịch có vị trí tốt hơn con người; cụ thể, trình biên dịch có thể không muốn hoặc không có khả năng nội tuyến hóa nhiều hàm mà con người muốn nó làm.
  • Trong quá trình phát triển của các hàm, chúng có thể trở nên thích hợp làm hàm nội tuyến, hoặc trở nên không còn thích hợp như đã từng. Mặc dù đánh dấu một hàm là nội tuyến hay không còn nội tuyến là một việc dễ dàng hơn việc chuyển đổi các hàm sang macro và ngược lại, công việc này vẫn đòi hỏi thêm công sức bảo trì, mà trong phần lớn các trường hợp, việc làm này đem lại lợi ích tương đối nhỏ.
  • Đối với các chương trình biên dịch đơn giản viết bằng C, việc sử dụng quá nhiều hàm nội tuyến có thể làm tăng thời gian biên dịch, do phần thân của các hàm đó phải được bổ sung dưới dạng văn bản vào bất cứ tập mã nguồn nào sử dụng chúng. (có thể thấy khi xem mã nguồn sau khi biên dịch sơ thảo (pre-compiled source) mà bộ biên dịch tạo ra).

Về các vấn đề với chính bản thân quá trình tối ưu hóa, thay vì về tính năng của ngôn ngữ, xem các vấn đề trong khai triển nội tuyến.

Trích dẫn

:"Việc khai báo một hàm [... ] dùng chỉ định inline thông báo rằng hàm này là một hàm nội tuyến. Chỉ định inline báo với việc thực hiện chương trình rằng việc thay thế nội tuyến của phần thân hàm tại thời điểm hàm được khởi động là một lựa chọn được cân nhắc hơn là cơ chế thi hành hàm bình thường. Việc thực hiện một cơ chế để thay thế hàm nội tuyến tại thời điểm hàm được khởi động là một việc không cần thiết; song, ngay cả khi bỏ qua việc thay thế nội tuyến, các nguyên tắc khác đối với các hàm nội tuyến được định nghĩa trong phần 7.1.2 cũng vẫn phải được tôn trọng." :— ISO 14882:1998(E), the current C++ standard, section 7.1.2

:"Một hàm được khai báo với chỉ định hàm inline là một hàm nội tuyến. [... ] Việc nội tuyến hóa một hàm gợi ý rằng các yêu cầu khởi động hàm phải được thi hành càng nhanh càng tốt. Phạm vi ảnh hưởng của những gợi ý như vậy có hiệu quả bao nhiêu còn tùy thuộc vào thực hiện (implementation-defined) (_ghi chú: Lấy ví dụ, một thực hiện có thể sẽ không bao giờ thi hành thay thế nội tuyến, hoặc chỉ thi hành thay thế nội tuyến đối với các yêu cầu khởi động trong phạm vi (scope) của một khai báo nội tuyến mà thôi_)

:"[... ] Một khai báo nội tuyến không cung cấp định nghĩa ngoại vi (external definition) cho một hàm, cũng không ngăn cấm một định nghĩa ngoại vi trong một đơn vị thông dịch (translation unit) khác. Định nghĩa nội tuyến cung cấp một hình thức thay thế cho định nghĩa ngoại vi, và một bộ thông dịch (translator) có thể sử dụng để thực hiện bất cứ một yêu cầu khởi động hàm nào trong cùng đơn vị thông dịch. Việc một yêu cầu thi hành một hàm nào đó sử dụng định nghĩa nội tuyến hoặc sử dụng định nghĩa ngoại tuyến là một việc không được xác định cụ thể." :— ISO 9899:1999(E), the C99 standard, section 6.7.4

👁️ 1 | 🔗 | 💖 | ✨ | 🌍 | ⌚
Trong khoa học máy tính, **hàm nội tuyến** (tiếng Anh: _inline function_) là một cấu trúc trong ngôn ngữ lập trình được sử dụng để đề nghị với chương trình biên dịch rằng một hàm
**Đường sắt đô thị Hà Nội** () là hệ thống đường sắt đô thị của thành phố Hà Nội. Hệ thống được vận hành bởi Công ty Đường sắt Hà Nội (Hanoi Metro Company –
**Đội tuyển bóng đá quốc gia Việt Nam** là đội tuyển bóng đá quốc gia đại diện cho Việt Nam thi đấu tại các giải đấu bóng đá quốc tế do Liên đoàn bóng đá
Trong toán học, thuật ngữ " **phiếm hàm** " (danh từ, tiếng Anh là **functional**) có ít nhất 3 nghĩa sau : nhỏ|451x451px|Phiêm hàm [[Chiều dài cung - Arc length|chiều dài cung đi từ miền
**Tuyến 2** hay còn gọi là **Tuyến Nội Bài – Hoàng Quốc Việt** hoặc **Tuyến Hoàn Kiếm** (Giai đoạn 1: **Nam Thăng Long – Trần Hưng Đạo**) là tuyến metro đang được giải phóng mặt
**Tuyến 3: Trôi – Nhổn – Ga Hà Nội – Hoàng Mai** là tuyến đường sắt đô thị đang được xây dựng và là một phần của hệ thống mạng lưới Đường sắt đô thị
**Trận Tuyên Quang** hay **Pháp đánh thành Tuyên Quang** là một phần của cuộc chiến tranh Pháp-Việt 1858-1884 diễn ra từ khoảng cuối tháng 5 năm 1884 và kết thúc vào ngày 3 tháng 3
Trong toán học, **hàm softmax**, hoặc **hàm trung bình mũ**, Biệt thức tuyến tính phân tích nhiều lớp, Phương pháp phân loại Bayes, và mạng neuron. Đặc biệt, trong hồi quy logistic đa biến và
|nhỏ|300x300px|Trong [[không gian Euclide ba chiều, ba mặt phẳng này biểu diễn các nghiệm của phương trình tuyến tính, và giao tuyến của chúng biểu thị tập các nghiệm chung: trong trường hợp này là
QUY ĐỊNH CHUNG CỦA LAZADA LÀ KHÔNG ĐƯỢC XEM HÀNG KHI NHẬN NHƯNG HỖ TRỢ ĐỔI TRẢ SAU KHI NHẬN NẾU SP KHÔNG ĐÚNG NHƯ MÔ TẢ�SHOP BẢO ĐẢM 1️⃣0️⃣0️⃣%�▶️ HÀNG GIỐNG HÌNH VÀ MÔ
**Đường Lê Duẩn** là một trong những tuyến đường trung tâm nằm ở thành phố Hà Nội, Việt Nam. Nó là một phần của đoạn đường Cái Quan thời phong kiến và Quốc lộ 1
thumb|Bản đồ của chính phủ Latvia cho thấy đường hầm từ Helsinki tới Tallinn có thể kết nối với [[đường sắt Baltica.]] **Đường hầm nối Helsinki – Tallinn** là một dự án đường hầm đường
**Đường vành đai 4 Hà Nội** (ký hiệu toàn tuyến là **CT.38**) là một đoạn đường vành đai thuộc hệ thống đường cao tốc Việt Nam để phục vụ giao thông của Vùng thủ đô
Trong toán học, một phép **biến đổi tuyến tính** (còn được gọi là **toán tử tuyến tính** hoặc là **ánh xạ tuyến tính**) là một ánh xạ V \rightarrow W giữa hai mô đun (cụ
Trong cách sử dụng thông thường, **tuyến tính** được dùng để nói lên một mối quan hệ toán học hoặc hàm có thể được biểu diễn trên đồ thị là một đường thẳng, như trong
nhỏ|[[Đồ thị của hàm số (màu đen) và tiếp tuyến của nó (màu đỏ). Hệ số góc của tiếp tuyến bằng đạo hàm của hàm đó tại tiếp điểm (điểm được đánh dấu).]] Trong toán
**Đường cao tốc Nội Bài – Lào Cai** (ký hiệu toàn tuyến là **CT.05**, hay còn gọi là **đường cao tốc Hà Nội – Lào Cai**) là một đoạn đường cao tốc thuộc hệ thống
**Đường hầm eo biển Manche** hay **Đường hầm eo biển Anh** (, ), là một đường hầm đường sắt dài 50,45 km bên dưới biển Manche tại Eo biển Dover, nối Folkestone, Kent ở Anh ()
**Câu lạc bộ bóng đá Hà Nội** () là một câu lạc bộ bóng đá chuyên nghiệp thuộc sở hữu của Tập đoàn T&T, có trụ sở tại Hà Nội và hiện đang thi đấu
**West Ham United Football Club** là một câu lạc bộ bóng đá chuyên nghiệp Anh đặt trụ sở tại vùng phía đông thành phố Luân Đôn, thủ đô nước Anh. West Ham United đã 3
**Hầm đường bộ Đèo Cả** là 1 hệ thống đường hầm thay thế cho Đèo Cả vốn rất hiểm trở và nguy hiểm. Đường hầm này nối liền 2 tỉnh Đắk Lắk và Khánh Hòa,
**Đường cao tốc Hà Nội – Hòa Bình – Sơn La – Điện Biên** (ký hiệu toàn tuyến là **CT.03**) là một đoạn đường cao tốc thuộc hệ thống đường cao tốc Việt Nam dài
**Trần Hàm** (chữ Hán: 陈咸, ? – ?), tên tự là **Phùng Nho**, người huyện Thiệp , quan viên nhà Nam Tống trong lịch sử Trung Quốc. Ông có công ổn định tình hình tài
nhỏ|Tuyến Duvernoy (màu vàng nhạt) nhìn từ mặt bên ở một con rắn có ngấn nếp. Nó ở mặt bên của mép, phần đuôi của mắt rắn. Bộ phận được che đậy bởi tấm vảy
nhỏ|[[Nút giao thông Thanh Xuân|Nút giao Thanh Xuân - hiện là nút giao thông nhiều tầng nhất tại Việt Nam (4 tầng)]] Hà Nội là thủ đô của Việt Nam và cũng là một trong
Trong vật lý và các ngành khoa học khác, một **hệ thống phi tuyến**, trái ngược với một hệ thống tuyến tính, là một hệ thống mà không thỏa mãn nguyên tắc xếp chồng -
nhỏ|Vị trí đường hầm Sakhalin **Đường hầm Sakhalin** () là một dự án giao thông chưa hoàn thành và đang bị hoãn lại. Nếu hoàn thành, nó sẽ nối đảo Sakhalin với lục địa Nga
**Tuyên Quang** là một tỉnh thuộc vùng trung du và miền núi Bắc Bộ. Việt Nam. ## Trước năm 1945 Tên gọi Tuyên Quang xuất hiện sớm nhất trong cổ thư ở nước ta là
Nội chiến Hoa Kỳ diễn ra ở nhiều nơi trong hai vùng chiến lược chính, Mặt trận miền Đông và Mặt trận miền Tây. Ngoài ra còn có mặt trận vùng sông Mississippi, bờ biển
**Đội tuyển bóng đá quốc gia Ý** () là đội tuyển bóng đá quốc gia đại diện cho nước Ý thi đấu ở các giải bóng đá cấp châu lục và thế giới. Đội tuyển
**Hoàn Tuyên** (chữ Hán: 桓宣, ? - 31 tháng 8, 344), người huyện Chí, Tiếu Quốc , tướng lĩnh nhà Đông Tấn. ## Chiêu hàng ổ chủ Ông là Hủ, làm Nghĩa Dương thái thú.
**Tàu điện ngầm vùng thủ đô Seoul tuyến số 5** (Tiếng Hàn: 수도권 전철 5 호선 _Sudogwon jeoncheol Ohoseon_, Hanja: 首都圈 電鐵 5號線) là tuyến đường sắt điện diện rộng kết nối Seoul và Hanam-si,
**Tuyên Quang** là thành phố tỉnh lỵ cũ của tỉnh Tuyên Quang, Việt Nam. ## Địa lý Thành phố Tuyên Quang nằm ở phía nam tỉnh Tuyên Quang, cách Hà Nội khoảng 165 km theo quốc
**Nội chiến Trung Quốc** hay **Quốc Cộng nội chiến** (), kéo dài từ tháng 4 năm 1927 đến tháng 5 năm 1950, là một cuộc nội chiến tại Trung Quốc đại lục (với chính quyền
nhỏ|Ma trận của biến đổi tuyến tính Trong đại số tuyến tính, một phép biến đổi tuyến tính có thể được biểu diễn bằng ma trận. Nếu _T_ là một biến đổi tuyến tính ánh
**Nội chiến Hoa Kỳ** (, 12 tháng 4 năm 1861 – 9 tháng 5 năm 1865, còn được biết đến với nhiều tên gọi khác nhau), là một cuộc nội chiến diễn ra ở Hoa
**Tiếp thị nội dung** là một thuật ngữ bao gồm tất cả dạng thức marketing liên quan đến việc tạo và chia sẻ nội dung. Nội dung được tạo ra dùng để hướng khách hàng
right|thumb|Một lưới hình chữ nhật (trên) và ảnh của nó qua một [[ánh xạ bảo giác (dưới).]] Trong toán học, một **hàm chỉnh hình** (**ánh xạ bảo giác**) là một hàm nhận giá trị phức
Trong kỹ thuật, **hàm truyền** (còn được gọi là **hàm hệ thống** hoặc **hàm mạng**) của thành phần hệ thống điện tử hoặc điều khiển là một hàm toán học mô hình hóa lý thuyết
**_Captain America: Nội chiến siêu anh hùng_** (tựa gốc tiếng Anh: **_Captain America: Civil War_**) là phim điện ảnh siêu anh hùng của Mỹ năm 2016 dựa trên nhân vật truyện tranh Captain America của
thumb|220x124px | right | Giới hạn của hàm số f(x) khi x tiến tới a
Mặc dù hàm số không được định nghĩa tại , khi tiến
[[Đồ thị hàm sin]] [[Đồ thị hàm cos]] [[Đồ thị hàm tan]] [[Đồ thị hàm cot]] [[Đồ thị hàm sec]] [[Đồ thị hàm csc]] Trong toán học nói chung và lượng giác học nói riêng,
nhỏ|phải|Một chiếc đài sóng ngắn analog **Vô tuyến sóng ngắn** là thông tin vô tuyến sử dụng tần số phía trên của MF (tần số trung bình) và tất cả dải tần HF (tần số
**Đội tuyển bóng đá quốc gia Đan Mạch** () là đội tuyển bóng đá đại diện cho Đan Mạch trên bình diện quốc tế. Đội được quản lý bởi Hiệp hội bóng đá Đan Mạch
**Đội tuyển bóng đá quốc gia Đức** () là đội tuyển bóng đá nam quốc gia đại diện cho Đức tại các giải đấu bóng đá quốc tế kể từ năm 1908. Kể từ khi
**Đường hầm sông Sài Gòn** (hay còn gọi là **hầm Thủ Thiêm**) là một đường hầm vượt qua sông Sài Gòn ở Thành phố Hồ Chí Minh, Việt Nam. Đây là một hạng mục của
**Cuộc khởi nghĩa của Nông Văn Vân** là một cuộc đấu tranh chống nhà Nguyễn của các dân tộc thiểu số ở Việt Bắc (Việt Nam) do Nông Văn Vân làm thủ lĩnh, xảy ra
**Cuộc vây hãm Yorktown**, còn được gọi là **Trận Yorktown**, **đầu hàng tại Yorktown**, **Trận chiến Đức** hay **cuộc bao vây Little York**, kết thúc vào ngày 19 tháng 10 năm 1781, tại Yorktown, Virginia,
**Bệnh viện Răng Hàm Mặt Trung ương Hà Nội** hay **Viện Răng Hàm Mặt Quốc gia** được thành lập theo Quyết định số 670/TTg-QĐ ngày 12/7/2006 của Thủ tướng chính phủ trên cơ sở Viện
**Tuyến nước bọt** ở động vật có vú thuộc loại tuyến ngoại tiết, có ống tuyến và nang tuyến, vai trò là sản xuất nước bọt. Chúng cũng chế tiết amylase, một enzym cắt tinh