Alignment là một hạn chế mà bộ nhớ vị trí byte đầu tiên của một giá trị có thể được lưu trữ . (Nó là cần thiết để cải thiện hiệu suất trên bộ vi xử lý và cho phép sử dụng các hướng dẫn nhất định 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 đến 16 byte, trong khi AVX đến 32 byte.)
Căn chỉnh 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
lực liên kết để yêu cầu số lượng byte (cppreference không đề cập đến nó, nhưng tôi nghĩ rằng bạn chỉ có thể sắp xếp để 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);
}
dụ đầu ra:
0xbfa493e0
0xbfa49000 // note how many more "zeros" now.
// binary equivalent
1011 1111 1010 0100 1001 0011 1110 0000
1011 1111 1010 0100 1001 0000 0000 0000 // every zero is just a extra power of 2
từ khóa khác
alignof
là rất thuận tiện, bạn không thể làm một cái gì đó giống như
int a[4];
assert(a % 16 == 0); // check if alignment is to 16 bytes: WRONG compiler error
nhưng bạn có thể làm
01.235.
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 hoạt động "%" (mô đun) đơn giản. Trong thực tế chúng ta biết rằng một cái gì đó liên kết đến 1024 byte được thiết liên kết đến 1, 2, 4, 8 byte nhưng
assert(alignof(b) == 32); // fail.
Vì vậy, để được chính xác hơn, "alignof" trả về sức mạnh vĩ đại nhất từ 2 đến Mà một cái gì đó là liên kết .
Cũng alignof là một cách tốt đẹp để 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 vv).
Tuy nhiên pháp luật:
alignas(alignof(float)) float SqDistance;
Something với một liên kết của 16 sau đó sẽ được đặt trên các địa chỉ có sẵn tiếp theo đó là một bội số của 16 (có thể có một lớp đệm ngầm từ địa chỉ sử dụng cuối cùng).
cppreference đang cố gắng trở thành tham chiếu thay vì hướng dẫn – Cubbi
@Cubbi: bạn cũng có thể kiểm tra tại cplusplus.com, có tranh luận về trang web tốt hơn, đối với một số chủ đề nhất định, tốt hơn, tôi đã tìm thấy cppreference cả hai trang web nhất định không phải là eonugh – GameDeveloper
@DarioOO Tôi chỉ trả lời tại sao cppreference không giải thích khái niệm căn lề trên trang 'alignof' (hiện tại, trên trang đối tượng [work-in-progress] (http: //en.cppreference.com/w/cpp/language/object#Alignment)). Tôi không thấy cplusplus.com có liên quan như thế nào. – Cubbi