2010-02-15 30 views
34

Bất cứ ai có thể giải thích chúng là gì và tại sao tôi cần chúng? Tôi đang xây dựng loại ứng dụng nào nếu tôi cần sử dụng nội tại?Nội tại là gì?

+0

http://en.wikipedia.org/wiki/Intrinsic_function – sellibitze

Trả lời

26

Thông thường, "nội tại" đề cập đến các hàm được tích hợp - tức là hầu hết các hàm thư viện chuẩn mà trình biên dịch có thể/sẽ tạo nội tuyến thay vì gọi hàm thực tế trong thư viện. Ví dụ, một cuộc gọi như: memset(array1, 10, 0) có thể được biên dịch cho một x86 như một cái gì đó như:

mov ecx, 10 
xor eax, eax 
mov edi, offset FLAT:array1 
rep stosb 

Intrinsics như thế này là hoàn toàn tối ưu. "Cần thiết" nội tại rất có thể sẽ là một tình huống mà trình biên dịch hỗ trợ nội tại cho phép bạn tạo mã mà trình biên dịch không thể (hoặc thường sẽ không) tạo trực tiếp. Đối với một ví dụ rõ ràng, một vài trình biên dịch cho x86 có "MMX Intrinsics" cho phép bạn sử dụng "các hàm" thực sự chỉ là các biểu diễn trực tiếp của các lệnh MMX.

5

Bản chất được trình biên dịch hiển thị dưới dạng các hàm không nằm trong bất kỳ thư viện nào, mỗi số.

Những thứ bạn có thể sử dụng nhiều nhất là nội tại lắp ráp được trình biên dịch xử lý như chính xác hướng dẫn máy mà chúng đại diện. Bạn sẽ sử dụng chúng, ví dụ, trong mã nơi bạn cần tận dụng lợi thế của một lệnh CPU cụ thể mà trình biên dịch không tự động tạo ra, và nơi bạn không nhất thiết yêu cầu một phần lắp ráp nội tuyến đầy đủ.

+1

trường hợp sử dụng: Bộ chỉ lệnh SIMD (SSE, Altivec, Neon) ở nơi khó để trình biên dịch tìm ra nơi sử dụng chúng, nhưng lợi ích của phân bổ đăng ký/quản lý khung stack vẫn có thể đạt được từ mã hóa trong C như trái ngược với assembler –

40

Chức năng nội tại là một hàm mà trình biên dịch thực hiện trực tiếp khi có thể, thay vì liên kết đến việc triển khai hàm do thư viện cung cấp.

Ví dụ phổ biến là strncpy().

Đối với chuỗi ngắn, thực hiện cuộc gọi hàm tới strncpy(), bao gồm thiết lập 'khung ngăn xếp' có địa chỉ trả về, sẽ tốn nhiều thời gian hơn so với việc sao chép byte thực tế. Tệ hơn nữa, hiệu ứng trên bộ đệm tìm nạp trước CPU sẽ ngăn chặn việc thực thi CPU cho một số chu kỳ đồng hồ.

Thay vào đó, chức năng nội tại được thực hiện bởi trình biên dịch thay cho một cuộc gọi hàm. Trong ví dụ về strncpy(), mã sao chép byte được phát trực tiếp tại địa điểm mà số strncpy() được gọi.

Tương tự như ví dụ strncpy() này, mọi chức năng nội tại được thực hiện trực tiếp dưới dạng mã nội tuyến nếu đáp ứng các yêu cầu bắt buộc.

Bản sao không nội tại của hàm nội tại thường vẫn tồn tại trong thư viện chuẩn, trong trường hợp cần có địa chỉ của hàm.

So với các hàm nội tuyến, hàm bên trong được trình biên dịch cung cấp. Không có một vị trí nào trong mã nguồn của chương trình C mà hàm nội tại được viết, cũng như không có thư viện thực hiện phải được liên kết đến. Một hàm nội tuyến khác với trình biên dịch đọc mã nguồn cho hàm inline, nhưng tương tự ở sau này nó có thể phát ra một bản dịch được biên dịch của hàm inline trực tiếp vào mã đối tượng, bỏ qua chi phí của một cuộc gọi hàm. Tóm lại, sự khác biệt thực tế giữa một hàm nội tại và hàm nội tuyến là các hàm nội tại là "hiện diện" ngay cả khi bạn không có #include tệp tiêu đề cần thiết có chứa khai báo hàm.Đối với hàm nội dòng, tệp tiêu đề có khai báo hàm phải là #include 'd (hoặc được khai báo khác) trước.

3

'' Nội tại '' là các tính năng của ngôn ngữ mà trình biên dịch nhận ra và thực hiện mà không cần chương trình khai báo chúng. Trình biên dịch có thể — hoặc có thể không — liên kết đến một thư viện thời gian chạy để thực hiện thao tác. Trong C++ ví dụ, các hoạt động sao chép cấu trúc là tiềm ẩn:

struct { 
    int a; 
    char b [100]; 
    long c [27]; 
} s, t; 

... 
s = t; // this statement copies hundreds of bytes, likely with a rtl call 

ví dụ khác bao gồm các ngôn ngữ như Fortran nơi có sự ủng hộ ngầm cho các loại hình phức tạp, và siêu việt (sin, tiếp tuyến, vv) chức năng cần không- và không thể - được tuyên bố. PHP, Javascript, Ruby, v.v. có hàng trăm chức năng nội tại như tạo và tìm kiếm các mảng, thực hiện các đối sánh cụm từ thông dụng, v.v.

Đối với các câu hỏi khác, khác biệt duy nhất là liệu chúng có cần phải khai báo. Ví dụ: chương trình C++ sử dụng hàm siêu việt phải bao gồm khai báo thư viện toán học:

#include <math.h> 

Không có mẫu ứng dụng cụ thể nào phụ thuộc vào nội tại; đó chỉ là vấn đề quan trọng đối với các nhà biên dịch và lập trình viên.

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