Tại sao và như thế nào là __attribute__
được sử dụng trong các chương trình GNU C?__attribute__ trong GNU C
Trả lời
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).
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.
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
@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
@GMan: khi nó được sử dụng, đó là một trong những hiệu ứng mà nó sẽ có. – mlp
Để 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ã.
- 1. Chữ ký của enum trong C/C99/C++/C++ x/GNU C/GNU C99
- 2. Hoán đổi nguyên tử trong GNU C++
- 3. C++: Những thông số GNU G ++ nào?
- 4. Có tương đương với __if_exists trong gnu C++ không?
- 5. Chạy cụm được tạo động trong C (GNU/Linux)
- 6. Trợ giúp triển khai GNU Readline trong C
- 7. được mong đợi '=', ',', ';', 'asm' hoặc '__attribute__' trước '.' mã thông báo
- 8. iphone lỗi: dự kiến '=',', ' ';', 'asm' hoặc '__attribute__' trước khi' 'foo'
- 9. Gnu C++ macro __cplusplus phù hợp với tiêu chuẩn?
- 10. Đóng gói các hàm C++ với trình liên kết GNU
- 11. __attribute__ ((không được chấp nhận)) không hoạt động trên các phương thức giao thức khách quan-c?
- 12. cách tắt vc-git trong GNU Emacs?
- 13. Phép nhân ma trận trong GSL-GNU
- 14. chạy grep từ bên trong GNU tạo
- 15. Hình ảnh hoặc tệp trong GNU Smalltalk?
- 16. Cờ -lrt trong gnu-make là gì?
- 17. Làm thế nào để nhúng GNU Octave vào chương trình C/C++?
- 18. GNU make cheat-sheet
- 19. Làm thế nào để sử dụng dấu chấm thập phân trong Gnu C++ (g ++)?
- 20. Khám phá các máy chủ DHCP bằng cách sử dụng multicast (224.0.0.12) trong GNU/Linux/C
- 21. Làm thế nào tôi có thể gấp các hàm kiểu GNU C trong Vim chính xác?
- 22. hành vi khác nhau unordered_multimap trong gnu ++ 11 và C++ 0x
- 23. Trình bày một số nguyên 64 bit trong GNU/Linux
- 24. Tăng bjam so với GNU tạo
- 25. Làm thế nào tôi nên sử dụng đúng __attribute__ ((định dạng (printf, x, y))) bên trong một phương thức lớp trong C++?
- 26. GNU Makefile và bash - thoát
- 27. Gỡ lỗi GNU thực hiện
- 28. Hướng dẫn làm gnu toàn diện/gcc
- 29. GNU Tạo kết quả hoàn toàn khác
- 30. gói pragma (1) cũng không __attribute__ ((căn chỉnh (1))) hoạt động
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. –