Lợi ích của chức năng nội tuyến trong C ++?


254

Những lợi thế / bất lợi của việc sử dụng các hàm nội tuyến trong C ++ là gì? Tôi thấy rằng nó chỉ tăng hiệu năng cho mã mà trình biên dịch tạo ra, nhưng với các trình biên dịch được tối ưu hóa ngày nay, CPU nhanh, bộ nhớ lớn, v.v. (không như trong năm 1980 <nơi bộ nhớ khan hiếm và mọi thứ phải phù hợp với bộ nhớ 100KB) lợi thế nào họ thực sự có ngày hôm nay?


48
Đây là một trong những câu hỏi mà kiến ​​thức phổ biến là sai. Mọi người đã trả lời với câu trả lời Comp Sci tiêu chuẩn. (Nội tuyến giúp tiết kiệm chi phí cuộc gọi chức năng nhưng tăng kích thước mã). Rác. Nó cung cấp một cơ chế đơn giản để trình biên dịch áp dụng nhiều TỐI ƯU HÓA.
Martin York

37
Đây là một trong những câu trả lời đặt ra như ý kiến. Nếu bạn không thích bất kỳ câu trả lời nào được đăng, hãy đăng câu trả lời của riêng bạn và xem nó diễn ra như thế nào.
Dave Van den Eynde

10
Cơ sở của câu hỏi này là thiếu sót. Các hàm nội tuyến C ++ ít liên quan đến trình biên dịch nội tuyến trong quá trình biên dịch. Thật không may inlinelà một từ khóa c ++ và nội tuyến là một kỹ thuật tối ưu hóa trình biên dịch. Xem câu hỏi này " khi nào tôi nên viết từ khóa inlinecho hàm / phương thức " để có câu trả lời đúng.
deft_code

3
@JoseVega Liên kết của bạn đã được xử lý - liên kết hiện tại là exforsys.com/tutorials/c-plus-plus/inline-fifts.html

Câu trả lời:


143

Các hàm nội tuyến nhanh hơn vì bạn không cần phải bật và bật các thứ trên / ngoài ngăn xếp như các tham số và địa chỉ trả về; tuy nhiên, nó làm cho nhị phân của bạn lớn hơn một chút.

Liệu nó có làm nên sự khác biệt đáng kể? Không đáng chú ý đủ trên phần cứng hiện đại cho hầu hết. Nhưng nó có thể tạo ra sự khác biệt, đủ cho một số người.

Đánh dấu một cái gì đó nội tuyến không cung cấp cho bạn một đảm bảo rằng nó sẽ là nội tuyến. Nó chỉ là một gợi ý cho trình biên dịch. Đôi khi không thể thực hiện được như khi bạn có chức năng ảo hoặc khi có đệ quy liên quan. Và đôi khi trình biên dịch chỉ chọn không sử dụng nó.

Tôi có thể thấy một tình huống như thế này tạo ra sự khác biệt có thể phát hiện:

inline int aplusb_pow2(int a, int b) {
  return (a + b)*(a + b) ;
}

for(int a = 0; a < 900000; ++a)
    for(int b = 0; b < 900000; ++b)
        aplusb_pow2(a, b);

26
Như tôi nghi ngờ nội tuyến làm cho không có sự khác biệt với ở trên. Được biên dịch với gcc 4.01. Phiên bản 1 buộc phải sử dụng nội tuyến: 48.318u 1.042s 5: 51,39 99,4% 0 + 0k 0 + 0io 0pf + 0w Phiên bản 2 bắt buộc không nội tuyến 348.311u 1.019s 5: 52.31 99.1% 0 + 0k 0 + 0io 0pf + 0w một ví dụ tốt là kiến ​​thức phổ biến là sai.
Martin York

36
trong khi bản thân cuộc gọi thực sự có vấn đề, đó chỉ là lợi ích nhỏ bạn có được bằng cách sử dụng nội tuyến. Lợi ích chính là, trình biên dịch bây giờ nhìn thấy nơi con trỏ không bí danh lẫn nhau, nơi các biến của người gọi kết thúc trong callee, v.v. Vì vậy, tối ưu hóa sau đây là những gì quan trọng hơn.
Julian Schaub - litb

31
Nó có thể không tạo ra sự khác biệt trong đoạn trích này vì kết quả của chức năng không bao giờ được sử dụng cũng như chức năng không có tác dụng phụ. Chúng tôi thấy mức tăng hiệu suất có thể đo được trong nội tuyến trong xử lý hình ảnh.
plinth

4
Lý do không có sự khác biệt có thể là trình biên dịch có thể tự nội tuyến; hoặc là mã nhỏ nên không có vấn đề tìm nạp mã.
einpoklum

3
@einpoklum Trình biên dịch thậm chí có thể tối ưu hóa toàn bộ vòng lặp vì điều đó.
noɥʇʎԀʎzɐɹƆ

197

Ưu điểm

  • Bằng cách nội tuyến mã của bạn ở nơi cần thiết, chương trình của bạn sẽ tốn ít thời gian hơn trong chức năng gọi và trả lại các phần. Nó được cho là làm cho mã của bạn đi nhanh hơn, ngay cả khi nó lớn hơn (xem bên dưới). Nội tuyến truy cập tầm thường có thể là một ví dụ về nội tuyến hiệu quả.
  • Bằng cách đánh dấu nó là nội tuyến, bạn có thể đặt một định nghĩa hàm trong tệp tiêu đề (nghĩa là nó có thể được bao gồm trong nhiều đơn vị biên dịch, mà không có trình liên kết phàn nàn)

Nhược điểm

  • Nó có thể làm cho mã của bạn lớn hơn (tức là nếu bạn sử dụng nội tuyến cho các hàm không tầm thường). Như vậy, nó có thể kích động phân trang và đánh bại tối ưu hóa từ trình biên dịch.
  • Nó hơi phá vỡ sự đóng gói của bạn vì nó phơi bày nội bộ của quá trình xử lý đối tượng của bạn (nhưng sau đó, mọi thành viên "riêng tư" cũng vậy). Điều này có nghĩa là bạn không được sử dụng nội tuyến trong mẫu PImpl.
  • Nó hơi phá vỡ sự đóng gói của bạn 2: Nội tuyến C ++ được giải quyết tại thời điểm biên dịch. Điều đó có nghĩa là nếu bạn thay đổi mã của hàm được nội tuyến, bạn sẽ cần biên dịch lại tất cả mã bằng cách sử dụng để đảm bảo mã sẽ được cập nhật (vì lý do tương tự, tôi tránh các giá trị mặc định cho tham số hàm)
  • Khi được sử dụng trong một tiêu đề, nó làm cho tệp tiêu đề của bạn lớn hơn và do đó, sẽ làm loãng các thông tin thú vị (như danh sách các phương thức lớp) với mã mà người dùng không quan tâm (đây là lý do tôi khai báo các hàm nội tuyến bên trong lớp, nhưng sẽ định nghĩa nó trong một tiêu đề sau thân lớp và không bao giờ bên trong thân lớp).

Ma thuật nội tuyến

  • Trình biên dịch có thể hoặc không thể nội tuyến các chức năng bạn đã đánh dấu là nội tuyến; nó cũng có thể quyết định các hàm nội tuyến không được đánh dấu là nội tuyến tại thời gian biên dịch hoặc liên kết.
  • Inline hoạt động giống như một bản sao / dán được kiểm soát bởi trình biên dịch, khác hẳn với macro của bộ xử lý trước: Macro sẽ bị ép buộc, sẽ gây ô nhiễm tất cả các không gian tên và mã, sẽ không dễ dàng gỡ lỗi và thậm chí sẽ được thực hiện nếu trình biên dịch sẽ cai trị nó là không hiệu quả.
  • Mọi phương thức của một lớp được định nghĩa bên trong phần thân của chính lớp đó được coi là "nội tuyến" (ngay cả khi trình biên dịch vẫn có thể quyết định không nội tuyến nó
  • Các phương thức ảo không được coi là không thể quét được. Tuy nhiên, đôi khi, khi trình biên dịch có thể biết chắc chắn loại đối tượng (tức là đối tượng được khai báo và xây dựng bên trong cùng một thân hàm), thậm chí một hàm ảo sẽ được nội tuyến vì trình biên dịch biết chính xác loại đối tượng.
  • Các phương thức / hàm mẫu không phải lúc nào cũng được nội tuyến (sự hiện diện của chúng trong một tiêu đề sẽ không làm cho chúng tự động nội tuyến).
  • Bước tiếp theo sau "nội tuyến" là siêu lập trình mẫu. Tức là bằng cách "nội tuyến" mã của bạn tại thời gian biên dịch, đôi khi, trình biên dịch có thể suy ra kết quả cuối cùng của hàm ... Vì vậy, một thuật toán phức tạp đôi khi có thể được giảm xuống thành một loại return 42 ;câu lệnh. Điều này là cho tôi cực kỳ nội tuyến . Nó hiếm khi xảy ra trong cuộc sống thực, nó làm cho thời gian biên dịch lâu hơn, sẽ không làm phồng mã của bạn và sẽ làm cho mã của bạn nhanh hơn. Nhưng giống như chén thánh, đừng cố áp dụng nó ở mọi nơi vì hầu hết quá trình xử lý không thể được giải quyết theo cách này ... Tuy nhiên, dù sao thì điều này cũng rất tuyệt ...
    :-p

bạn nói Nó hơi phá vỡ sự đóng gói của bạn. Bạn sẽ giải thích nó bằng một ví dụ?
Kẻ hủy diệt

6
@PravasiMeet: Đó là C ++. Giả sử bạn cung cấp một thư viện DLL / chia sẻ cho một khách hàng, người biên dịch lại nó. Hàm nội tuyến foo, sử dụng biến thành viên X và thực hiện công việc Y sẽ được nhập vào mã của máy khách. Giả sử cần cung cấp một phiên bản cập nhật của DLL của bạn, nơi bạn đã thay đổi biến thành viên thành Z và thêm YY ngoài công việc Y. Khách hàng chỉ sao chép DLL vào dự án của họ và BOOM, vì mã của foo trong nhị phân của họ không phải là mã cập nhật mà bạn đã viết ... Mặc dù khách hàng không có quyền truy cập hợp pháp vào mã riêng của bạn, nhưng nội tuyến làm cho nó khá "công khai".
paercebal

@paercebal Về điểm đạn thứ hai đến điểm cuối cùng của bạn, bạn có thể đưa ra một ví dụ về khi mẫu hàm không nội tuyến không? Tôi nghĩ rằng chúng luôn luôn nội tuyến, mặc dù bây giờ tôi không có tài liệu tham khảo (một thử nghiệm đơn giản dường như xác nhận nó).
Konrad Rudolph

@KonradRudolph Năm n4594 tôi thấy : 3.2/6: There can be more than one definition of [..] inline function with external linkage [..] non-static function template. Ở 5.1.5 / 6 For a generic lambda, the closure type has a public inline function call operator member template. Và tại 7.1.2/2: the use of inline keyword is to declare an inline functionđó là một gợi ý để nội tuyến cơ thể chức năng tại điểm gọi. Vì vậy, tôi kết luận rằng ngay cả khi chúng có thể hoạt động giống nhau, các hàm nội tuyến và các mẫu hàm vẫn tách biệt, các khái niệm trực giao có thể được trộn lẫn (ví dụ như mẫu hàm nội tuyến)
paercebal

đóng gói bị hỏng? Làm sao vậy đóng gói là dành cho anh chàng (s) lập trình, không phải cho các đối tượng thực tế trong bộ nhớ. Tại thời điểm đó không ai quan tâm. Ngay cả khi bạn phân phối một thư viện, trình biên dịch có thể chọn nội tuyến hoặc không tự mình làm như vậy. Vì vậy, cuối cùng khi bạn nhận được một lib mới, bạn chỉ cần biên dịch lại mọi thứ sử dụng các hàm và đối tượng từ thư viện đó.
FalcoGer

42

Trong C cổ C và C ++, inlinegiống như register: một gợi ý (không có gì hơn một gợi ý) cho trình biên dịch về một tối ưu hóa có thể.

Trong C ++ hiện đại, inlinenói với trình liên kết rằng, nếu tìm thấy nhiều định nghĩa (không phải khai báo) trong các đơn vị dịch khác nhau, thì tất cả đều giống nhau và trình liên kết có thể tự do giữ một và loại bỏ tất cả các định nghĩa khác.

inline là bắt buộc nếu một hàm (bất kể phức tạp hay "tuyến tính") được xác định trong tệp tiêu đề, để cho phép nhiều nguồn bao gồm nó mà không gặp lỗi "nhiều định nghĩa" bởi trình liên kết.

Các hàm thành viên được định nghĩa bên trong một lớp là "nội tuyến" theo mặc định, cũng như các hàm mẫu (trái ngược với các hàm toàn cục).

//fileA.h
inline void afunc()
{ std::cout << "this is afunc" << std::endl; }

//file1.cpp
#include "fileA.h"
void acall()
{ afunc(); }

//main.cpp
#include "fileA.h"
void acall();

int main()
{ 
   afunc(); 
   acall();
}

//output
this is afunc
this is afunc

Lưu ý việc đưa tệpA.h vào hai tệp .cpp, dẫn đến hai trường hợp afunc(). Trình liên kết sẽ loại bỏ một trong số họ. Nếu không inlineđược chỉ định, trình liên kết sẽ khiếu nại.


16

Nội tuyến là một gợi ý cho trình biên dịch mà nó miễn phí bỏ qua. Đó là lý tưởng cho các bit mã nhỏ.

Nếu chức năng của bạn được nội tuyến, về cơ bản, nó sẽ được chèn vào mã nơi thực hiện lệnh gọi hàm, thay vì thực sự gọi một chức năng riêng biệt. Điều này có thể hỗ trợ tốc độ vì bạn không phải thực hiện cuộc gọi thực tế.

Nó cũng hỗ trợ CPU với đường ống vì chúng không phải tải lại đường ống với các hướng dẫn mới do cuộc gọi gây ra.

Nhược điểm duy nhất là có thể tăng kích thước nhị phân, nhưng miễn là các hàm nhỏ, điều này sẽ không quá quan trọng.

Tôi có xu hướng để lại các loại quyết định cho các trình biên dịch ngày nay (tốt, dù sao thì những người thông minh). Những người đã viết chúng có xu hướng có kiến ​​thức chi tiết hơn nhiều về các kiến ​​trúc cơ bản.


12

Hàm nội tuyến là kỹ thuật tối ưu hóa được sử dụng bởi các trình biên dịch. Người ta có thể chỉ cần thêm từ khóa nội tuyến vào nguyên mẫu hàm để tạo một hàm nội tuyến. Hàm nội tuyến hướng dẫn trình biên dịch chèn toàn bộ phần thân của hàm vào bất cứ nơi nào hàm đó được sử dụng trong mã.

Ưu điểm: -

  1. Nó không yêu cầu chức năng gọi qua đầu.

  2. Nó cũng tiết kiệm chi phí cho các biến đẩy / bật trên ngăn xếp, trong khi gọi hàm.

  3. Nó cũng tiết kiệm chi phí của cuộc gọi trở lại từ một chức năng.

  4. Nó tăng địa phương tham chiếu bằng cách sử dụng bộ đệm hướng dẫn.

  5. Sau khi trình biên dịch nội tuyến cũng có thể áp dụng tối ưu hóa thủ tục nếu được chỉ định. Đây là một trong những quan trọng nhất, theo cách này, trình biên dịch giờ đây có thể tập trung vào việc loại bỏ mã chết, có thể gây căng thẳng hơn cho dự đoán nhánh, loại bỏ biến cảm ứng, v.v.

Để kiểm tra thêm về nó, người ta có thể theo liên kết này http://tajendrasengar.blogspot.com/2010/03/what-is-inline-feft-in-cc.html


4
1) Đó là một gợi ý, không phải là hướng dẫn 2) Nó có thể gây ra nhiều lỗi bộ nhớ cache hơn do tăng kích thước mã nếu một chức năng thường được sử dụng được nội tuyến nhiều
Flexo

3
Là liên kết ở cuối blog cá nhân của bạn? Nếu đó là bạn nên khai báo như vậy, nếu không nó trông giống như thư rác.
Flexo

6

Tôi muốn thêm rằng các hàm nội tuyến rất quan trọng khi bạn xây dựng thư viện dùng chung. Không có chức năng đánh dấu nội tuyến, nó sẽ được xuất vào thư viện ở dạng nhị phân. Nó cũng sẽ có mặt trong bảng ký hiệu, nếu được xuất. Mặt khác, các hàm nội tuyến không được xuất, không vào các tệp nhị phân của thư viện cũng như bảng biểu tượng.

Nó có thể rất quan trọng khi thư viện dự định được tải trong thời gian chạy. Nó cũng có thể đạt các thư viện nhận biết tương thích nhị phân. Trong những trường hợp như vậy không sử dụng nội tuyến.


@Johnsyweb: đọc kỹ câu trả lời của tôi. Những gì bạn đã nói là đúng, khi bạn đang xây dựng một thực thi. Nhưng trình biên dịch không thể đơn giản bỏ qua inlinekhi xây dựng một thư viện chia sẻ!
doc

4

Trong quá trình tối ưu hóa, nhiều trình biên dịch sẽ thực hiện các hàm nội tuyến ngay cả khi bạn không đánh dấu chúng. Bạn thường chỉ cần đánh dấu các hàm là nội tuyến nếu bạn biết thứ gì đó trình biên dịch không có, vì nó thường có thể tự đưa ra quyết định chính xác.


Nhiều trình biên dịch cũng sẽ không làm điều này, ví dụ MSVC sẽ không làm điều này trừ khi bạn nói với nó
paulm

4

inlinecho phép bạn đặt định nghĩa hàm trong tệp tiêu đề và #includetệp tiêu đề đó trong nhiều tệp nguồn mà không vi phạm quy tắc một định nghĩa.


3

Nói chung, những ngày này với bất kỳ trình biên dịch hiện đại nào lo lắng về nội dung bất cứ điều gì là khá lãng phí thời gian. Trình biên dịch thực sự nên tối ưu hóa tất cả các cân nhắc này cho bạn thông qua phân tích mã riêng và đặc tả của bạn về các cờ tối ưu hóa được truyền cho trình biên dịch. Nếu bạn quan tâm đến tốc độ, hãy báo cho trình biên dịch để tối ưu hóa tốc độ. Nếu bạn quan tâm đến không gian, hãy báo cho trình biên dịch để tối ưu hóa cho không gian. Như một câu trả lời khác ám chỉ, một trình biên dịch đàng hoàng thậm chí sẽ tự động nội tuyến nếu nó thực sự có ý nghĩa.

Ngoài ra, như những người khác đã nêu, sử dụng nội tuyến không đảm bảo nội tuyến của bất cứ điều gì. Nếu bạn muốn đảm bảo nó, bạn sẽ phải xác định một macro thay vì một hàm nội tuyến để làm điều đó.

Khi nào để nội tuyến và / hoặc xác định một macro để buộc bao gồm? - Chỉ khi bạn có tốc độ tăng được chứng minh và cần thiết đã được chứng minh về tốc độ cho một phần quan trọng của mã được biết là có ảnh hưởng đến hiệu suất chung của ứng dụng.


Nếu bạn quan tâm đến không gian, hãy nói cho trình biên dịch tối ưu hóa cho không gian - bảo trình biên dịch tối ưu hóa tốc độ có thể dẫn đến các nhị phân nhỏ hơn với C ++ và C. tương tự, bảo trình biên dịch tối ưu hóa cho không gian có thể thực hiện nhanh hơn. iow, những tính năng này không phải lúc nào cũng hoạt động như quảng cáo. con người có khả năng hiểu một số khía cạnh của chương trình của họ tốt hơn so với các diễn giải tổng quát của một nhà soạn nhạc (cũng phải duy trì nhanh chóng có thể sử dụng được). sự can thiệp của con người không phải là một điều xấu.
justin

3

Nó không phải là tất cả về hiệu suất. Cả C ++ và C đều được sử dụng để lập trình nhúng, nằm trên phần cứng. Ví dụ, nếu bạn muốn viết một trình xử lý ngắt, bạn cần đảm bảo rằng mã có thể được thực thi ngay lập tức, mà không cần đăng ký bổ sung và / hoặc các trang bộ nhớ được hoán đổi. Đó là khi nội tuyến có ích. Trình biên dịch tốt thực hiện một số "nội tuyến" khi cần tốc độ, nhưng "nội tuyến" bắt buộc chúng.


1

Đã gặp rắc rối tương tự với các hàm nội tuyến vào các thư viện. Có vẻ như các hàm nội tuyến không được biên dịch vào thư viện. kết quả là trình liên kết đưa ra lỗi "tham chiếu không xác định", nếu một tệp thực thi muốn sử dụng hàm nội tuyến của thư viện. (đã xảy ra với tôi khi biên dịch nguồn Qt với gcc 4.5.


1

Tại sao không làm cho tất cả các chức năng nội tuyến theo mặc định? Bởi vì đó là một sự đánh đổi kỹ thuật. Có ít nhất hai loại "tối ưu hóa": tăng tốc chương trình và giảm kích thước (dấu chân bộ nhớ) của chương trình. Nội tuyến nói chung tăng tốc mọi thứ. Nó được loại bỏ chức năng gọi qua chức năng, tránh đẩy sau đó kéo các tham số từ ngăn xếp. Tuy nhiên, nó cũng làm cho dung lượng bộ nhớ của chương trình lớn hơn, bởi vì mọi lệnh gọi hàm bây giờ phải được thay thế bằng mã đầy đủ của hàm. Để làm cho mọi thứ trở nên phức tạp hơn, hãy nhớ rằng CPU lưu trữ các khối bộ nhớ được sử dụng thường xuyên trong bộ đệm trên CPU để truy cập cực nhanh. Nếu bạn làm cho hình ảnh bộ nhớ của chương trình đủ lớn, chương trình của bạn sẽ không thể sử dụng bộ đệm một cách hiệu quả và trong trường hợp xấu nhất, nội tuyến có thể thực sự làm chậm chương trình của bạn.


1

Giáo sư khoa học máy tính của chúng tôi kêu gọi chúng tôi không bao giờ sử dụng nội tuyến trong chương trình c ++. Khi được hỏi tại sao, ông vui lòng giải thích cho chúng tôi rằng trình biên dịch hiện đại sẽ phát hiện khi nào nên sử dụng nội tuyến tự động.

Vì vậy, có, nội tuyến có thể là một kỹ thuật tối ưu hóa được sử dụng bất cứ khi nào có thể, nhưng rõ ràng đây là điều đã được thực hiện cho bạn bất cứ khi nào có thể nội tuyến một chức năng.


5
Giáo sư của bạn không may là hoàn toàn sai. inlinetrong C ++ có hai ý nghĩa rất khác biệt - chỉ một trong số đó có liên quan đến tối ưu hóa, và giáo sư của bạn là chính xác liên quan đến điều đó. Tuy nhiên, ý nghĩa thứ hai inlinethường là cần thiết để đáp ứng Quy tắc Một định nghĩa .
Konrad Rudolph

-1

Kết luận từ một cuộc thảo luận khác ở đây:

Có bất kỳ nhược điểm với các chức năng nội tuyến?

Rõ ràng, không có gì sai khi sử dụng các hàm nội tuyến.

Nhưng nó đáng lưu ý các điểm sau đây!

  • Việc sử dụng quá mức nội tuyến thực sự có thể làm cho các chương trình chậm hơn. Tùy thuộc vào kích thước của hàm, nội tuyến có thể khiến kích thước mã tăng hoặc giảm. Nội tuyến một hàm truy cập rất nhỏ thường sẽ làm giảm kích thước mã trong khi nội tuyến một hàm rất lớn có thể làm tăng đáng kể kích thước mã. Trên các bộ xử lý hiện đại, mã nhỏ hơn thường chạy nhanh hơn do sử dụng bộ đệm lệnh tốt hơn. - Nguyên tắc của Google

  • Lợi ích tốc độ của các hàm nội tuyến có xu hướng giảm dần khi hàm tăng kích thước. Tại một số điểm, tổng phí của lệnh gọi hàm trở nên nhỏ so với việc thực thi thân hàm và lợi ích bị mất - Nguồn

  • Có một vài tình huống mà một hàm nội tuyến có thể không hoạt động:

    • Đối với một hàm trả về giá trị; nếu một tuyên bố trở lại tồn tại.
    • Đối với một hàm không trả về bất kỳ giá trị nào; nếu một vòng lặp, chuyển đổi hoặc lệnh goto tồn tại.
    • Nếu một hàm là đệ quy. -Nguồn
  • Các __inlinetừ khóa gây ra một chức năng để được inlined chỉ nếu bạn chỉ định các tùy chọn tối ưu hóa. Nếu tối ưu hóa được chỉ định, việc có __inlineđược vinh danh hay không phụ thuộc vào cài đặt của tùy chọn tối ưu hóa nội tuyến. Theo mặc định, tùy chọn nội tuyến có hiệu lực bất cứ khi nào trình tối ưu hóa được chạy. Nếu bạn chỉ định tối ưu hóa, bạn cũng phải chỉ định tùy chọn noinline nếu bạn muốn __inlinebỏ qua từ khóa. -Nguồn


3
Sẽ đúng nếu nội tuyến là một lệnh và không phải là một gợi ý cho trình biên dịch. Trình biên dịch thực sự quyết định những gì để nội tuyến.
Martin York

1
@LokiAstari Tôi biết rằng nội tuyến là yêu cầu trình biên dịch. Đối số của tôi là Nếu gợi ý của nó cho trình biên dịch, chúng ta nên để nó cho trình biên dịch để quyết định cái gì là tốt nhất. Tại sao phải sử dụng nội tuyến theo bất kỳ cách nào ngay cả khi bạn sử dụng nội tuyến, đó vẫn là trình biên dịch sẽ đưa ra quyết định cuối cùng. Tôi cũng tự hỏi Microsoft của tôi đã giới thiệu _forceinline.
Krishna Oza

@krish_oza: Nhận xét của tôi ở đây. Là về câu trả lời này. Câu trả lời ở đây là hoàn toàn sai. Bởi vì trình biên dịch bỏ qua inlinetừ khóa để xác định xem cónội tuyến hay không, tất cả các điểm được thực hiện ở trên đều sai. Chúng sẽ đúng nếu trình biên dịch sử dụng từ khóa để nội tuyến (nó chỉ được sử dụng để xác định đánh dấu nhiều định nghĩa cho mục đích liên kết).
Martin York
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.