Trích:
Nguyên văn bởi lybao_huy
Hiện tại mình cũng không hiểu có gì khác nhau giữa các cách khai báo biến sau:
a/ int x __attribute__ ((aligned (8))) ; và int x;
b/ int x __attribute__ ((aligned )) ; và int x;
c/ int x __attribute__ ((packed)); và int x;
mong bạn giải thích dùm
|
1 - aligned để sắp xếp biến được khai báo tại vị trí có địa chỉ là bội của 1 giá trị nhất định. Còn tại sao giá trị đó phải là lũy thừa của 2 thì mình ko rõ.
VD: Bạn khai báo
Code:
char a;
char str[128];
Biến a có địa chỉ = 0, str trỏ tới địa chỉ = 1. str là byte-aligned. Kiến trúc của dsPIC ko cho phép truy xuất WORD theo byte-aligned. Tức là nếu bạn thực hiện biểu thức:
Code:
int *wptr = (int*)str;
(*wptr)++;
sẽ xảy ra trap address error.
Trong trường hợp này bạn phải khai báo
Code:
char a;
char str[128] __attribute__ ((aligned(2))) ;
Bây giờ con trỏ str sẽ trỏ tới địa chỉ là 2 thay vì 1. Các aligned cao hơn chỉ dành cho các hàm DSP.
2 - packed ngược lại với aligned để giảm align tới mức thấp nhất có thể. Thường dùng với struct
VD:
Code:
struct{
char a;
int i;
}s;
địa chỉ của field a = 0, và địa chỉ của field i = 2 vì biến i cần word-aligned. Và sizeof(s) = 4. Tuy nhiên nếu bạn khai báo
Code:
struct __attribute__ ((packed)){
char a;
int i;
}s;
Khi đó địa chỉ của field i = 1. và sizeof(s) = 3. Nhưng bây giờ ko thể truy xuất biến i theo word vì nó misaligned.