Căn chỉnh là một hạn chế về vị trí bộ nhớ mà byte đầu tiên của giá trị có thể được lưu trữ. (Cần phải cải thiện hiệu suất trên bộ xử lý và cho phép sử dụng một số hướng dẫn chỉ hoạt động trên dữ liệu có căn chỉnh cụ thể, ví dụ: SSE cần được căn chỉnh thành 16 byte, trong khi AVX là 32 byte.)
Căn 16 có nghĩa là địa chỉ bộ nhớ là bội số của 16 là địa chỉ hợp lệ duy nhất.
alignas
buộc căn chỉnh đến số byte yêu cầu. Bạn chỉ có thể căn chỉnh theo lũy thừa của 2: 1, 2, 4, 8, 16, 32, 64, 128, ...
#include <cstdlib>
#include <iostream>
int main() {
alignas(16) int a[4];
alignas(1024) int b[4];
printf("%p\n", a);
printf("%p", b);
}
đầu ra ví dụ:
0xbfa493e0
0xbfa49000
1011 1111 1010 0100 1001 0011 1110 0000
1011 1111 1010 0100 1001 0000 0000 0000
từ khóa khác
alignof
rất thuận tiện, bạn không thể làm điều gì đó như
int a[4];
assert(a % 16 == 0);
nhưng bạn có thể làm
assert(alignof(a) == 16);
assert(alignof(b) == 1024);
lưu ý rằng trong thực tế, điều này nghiêm ngặt hơn một hoạt động đơn giản "%" (modulus). Trên thực tế, chúng tôi biết rằng thứ gì đó được căn chỉnh đến 1024 byte nhất thiết phải được căn chỉnh thành 1, 2, 4, 8 byte nhưng
assert(alignof(b) == 32);
Vì vậy, chính xác hơn, "alignof" trả về sức mạnh lớn nhất của 2 để điều gì đó được căn chỉnh.
Ngoài ra alignof là một cách hay để biết trước yêu cầu căn chỉnh tối thiểu cho các kiểu dữ liệu cơ bản (nó có thể sẽ trả về 1 cho ký tự, 4 cho float, v.v.).
Vẫn hợp pháp:
alignas(alignof(float)) float SqDistance;
Một thứ gì đó có căn chỉnh là 16 sau đó sẽ được đặt trên địa chỉ có sẵn tiếp theo là bội số của 16 (có thể có một phần đệm ẩn từ địa chỉ được sử dụng gần đây nhất).