2009-09-22 31 views

Trả lời

28

GCC thuộc tính: thuộc tính

  • Chức năng mô tả here
  • thuộc tính Biến mô tả here
  • Loại thuộc tính mô tả here
+4

Trong khi các liên kết này hữu ích, câu trả lời này không cung cấp bất kỳ thông tin nào. –

9

Một cách sử dụng là thực thi căn chỉnh bộ nhớ trên các biến và cấu trúc thành viên. Ví dụ:

float vect[4] __attribute__((aligned(16))); 

Sẽ đảm bảo rằng vect sẽ được đặt trên ranh giới bộ nhớ 16 byte. Tôi không biết nếu đó là một gcc-ism hoặc thường áp dụng hơn.

Trình biên dịch thường sẽ chỉ liên kết vect trên ranh giới 4 byte. Với sự liên kết 16 byte, nó có thể được sử dụng trực tiếp với các hướng dẫn tải SIMD, nơi bạn sẽ nạp nó vào một thanh ghi 128 bit cho phép các phép cộng, trừ, dấu chấm và tất cả các hoạt động vector.

Đôi khi bạn muốn căn chỉnh sao cho cấu trúc có thể được chồng lên trực tiếp lên thanh ghi phần cứng được ánh xạ trên bộ nhớ. Hoặc nó phải được căn chỉnh sao cho phần cứng có thể ghi vào nó trực tiếp sử dụng một cơ chế truy nhập bộ nhớ trực tiếp (DMA).

-2

Tại sao nó được sử dụng trong các chương trình C? Để hạn chế tính di động của họ.

Nó bắt đầu với dấu gạch dưới kép, do đó, nó nằm trong không gian tên của người triển khai - nó không được định nghĩa theo tiêu chuẩn ngôn ngữ và mỗi nhà cung cấp trình biên dịch được tự do sử dụng nó cho bất kỳ mục đích nào.

Chỉnh sửa: Tại sao nó được sử dụng trong các chương trình GNU C? Xem các câu trả lời khác giải quyết vấn đề này.

+4

Uh, tôi không nghĩ rằng nó được sử dụng đặc biệt cho mục đích đóng vai trò di chuyển. – GManNickG

+1

@mpl Vì vậy, không sử dụng nó. Các thuộc tính cho phép bạn ép nhiều hơn phần cứng của bạn, nhưng bạn không bị buộc phải làm điều đó. – qrdl

+0

@GMan: khi nó được sử dụng, đó là một trong những hiệu ứng mà nó sẽ có. – mlp

16

Để biết các trình biên dịch GCC và GCC nào sử dụng __attribute__ hầu hết các trình biên dịch khác sử dụng chỉ thị #pragma.

Tôi nghĩ giải pháp của GCC là tốt hơn vì hành vi yêu cầu của một số không được công nhận là #pragma là bỏ qua nó, trong khi nếu bạn sử dụng trình biên dịch không hiểu đặc điểm __attribute__ thì nó sẽ không biên dịch. biết những gì bạn cần để cổng.

Đặc tính thuộc tính được sử dụng để xác định các khía cạnh của loại, dữ liệu và chức năng như lưu trữ và căn chỉnh không thể chỉ định bằng C. Thường thì chúng là mục tiêu cụ thể, chủ yếu là chúng không cầm tay, chắc chắn giữa các trình biên dịch và thường giữa các mục tiêu . Tránh sử dụng của chúng, ngoại trừ những nơi hoàn toàn cần thiết cho đúng chức năng của mã.

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