2015-11-11 16 views
8

Trong C, có cách nào để có được sự liên kết quá mức (nghĩa là sự căn chỉnh nhiều hơn có thể được suy ra từ hệ thống kiểu) trên ngăn xếp không?Tương đương với std :: aligned_storage <> trong C?

Đối với các biến trong bộ nhớ được cấp động, chúng tôi luôn có thể sắp xếp theo cách thủ công nếu mọi thứ khác không thành công nhưng có thể làm gì cho các biến trong bộ nhớ được cấp phát tự động?

Tôi đoán có thể sử dụng char[size + alignment - 1] và sau đó luôn sử dụng thao tác bit để truy cập biến nhưng điều này có vẻ như là "chút" bóng mờ hơn cần thiết (har har har;)).

+0

Bạn đã thử định danh _Alignas? – this

+0

@ này oops, tôi nên có đề cập, không có C11, nhờ – Praxeolitic

+0

Tại sao bạn chấp nhận câu trả lời khác nếu C11 không phải là một lựa chọn? :-( – this

Trả lời

5

Trong C2011, có các từ khóa _Alignas_Alignof, tiêu đề <stdalign.h> mà làm cho việc sử dụng chúng một chút ít xấu xí, và loại max_align_t (mà là ở <stddef.h>). Bạn có thể, ví dụ, viết

double _Alignas(4*_Alignof(double)) dvector[16]; 

để yêu cầu một mảng của 16 double số lượng liên kết đến 4x sự liên kết thông thường cho double, như có thể là cần thiết để sử dụng với hướng dẫn vector CPU cụ thể. Điều này không được đảm bảo để làm việc trên tất cả các triển khai, nhưng nếu nó không hoạt động, nó được đảm bảo là một lỗi biên dịch thời gian.

Trước khi C2011 không có tiêu chuẩn cách để làm điều này, nhưng nhiều trình biên dịch đã có tiện ích mở rộng có chức năng tương tự, ví dụ: GCC's __attribute__ (aligned) xây dựng.

5

Các công đoàn tốt đến với tâm trí.

union This 
{ 
    int integer; 
    align_type alignment; 
} ; 

Không có phần đệm trước thành viên trong công đoàn. Vì vậy, nếu bạn khai báo một biến tự động union This, thì nó và tất cả các thành viên của nó, phải được căn chỉnh giống như là căn chỉnh của thành viên có căn chỉnh cao nhất.

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