使用__attribute__處理對齊問題
__attribute__ 的語法為:
__attribute__ ((語法列表))
引數aligned(number) [number為最小對齊的位元組數]是用得較多的一個。
另一個是引數packed 表示“使用最小對齊”方式,即對變數是位元組對齊,對於域是位對齊。
這個例子稍長了點,不過非常簡單:
[root@Kendo develop]# cat align.c
[code]#include <stdio.h>
struct A{
char a;
int b;
unsigned short c;
long d;
unsigned long long e;
char f;
};
struct B{
char a;
int b;
unsigned short c;
long d;
unsigned long long e;
char f;
}__attribute__((aligned));
struct C{
char a;
int b;
unsigned short c;
long d;
unsigned long long e;
char f;
}__attribute__((aligned(1)));
struct D{
char a;
int b;
unsigned short c;
long d;
unsigned long long e;
char f;
}__attribute__((aligned(4)));
struct E{
char a;
int b;
unsigned short c;
long d;
unsigned long long e;
char f;
}__attribute__((aligned(8)));
struct F{
char a;
int b;
unsigned short c;
long d;
unsigned long long e;
char f;
}__attribute__((packed));
int main(int argc, char **argv)
{
printf("A = %d, B = %d, C = %d, D = %d, E = %d, F = %d/n",
sizeof(struct A), sizeof(struct B), sizeof(struct C), sizeof(struct D), sizeof(struct E), sizeof(struct F));
return 0;
}[/code]
在一個32位機上執行結果如下:
[code][root@Kendo develop]# gcc -o align align.c
[root@Kendo develop]# ./align
A = 28, B = 32, C = 28, D = 28, E = 32, F = 20[/code]
我們看到,最後一個struct F,1 + 4 + 2 + 4 + 8 + 1 = 20,因為使用了__attribute__((packed)); 來表示以最小方式對齊,所以結果剛好為20。
而第一個struct A,因為什麼也沒有跟,採用預設處理方式:4(1) + 4 + 4(2) + 4 + 8 + 4(1) = 28,括號中是其成員本來的大小。與此相似的是struct D。
接下來看struct E,採用8個位元組的方式來對齊:8(1+4+2 ,即a, b, c)+ 8(4, d) + 8 + 8(1, f) = 32。
而在struct C中,試圖使用__attribute__((aligned(1))) 來使用1個位元組方式的對齊,不過並未如願,仍然採用了預設4個位元組的對齊方式。
在struct B中,aligned沒有引數,表示“讓編譯器根據目標機制採用最大最有益的方式對齊"——當然,最有益應該是執行效率最高吧,呵呵。其結果是與struct E相同。
在對結構的大小並不關注的時候,採用預設對齊方式或者編譯器認為最有益的方式是最常見的,然後,對於一些對結構空間大小要求嚴格,例如定義一個資料包報頭的時候,明白結構的對齊方式,就非常有用了。
__attribute__ ((語法列表))
引數aligned(number) [number為最小對齊的位元組數]是用得較多的一個。
另一個是引數packed 表示“使用最小對齊”方式,即對變數是位元組對齊,對於域是位對齊。
這個例子稍長了點,不過非常簡單:
[root@Kendo develop]# cat align.c
[code]#include <stdio.h>
struct A{
char a;
int b;
unsigned short c;
long d;
unsigned long long e;
char f;
};
struct B{
char a;
int b;
unsigned short c;
long d;
unsigned long long e;
char f;
}__attribute__((aligned));
struct C{
char a;
int b;
unsigned short c;
long d;
unsigned long long e;
char f;
}__attribute__((aligned(1)));
struct D{
char a;
int b;
unsigned short c;
long d;
unsigned long long e;
char f;
}__attribute__((aligned(4)));
struct E{
char a;
int b;
unsigned short c;
long d;
unsigned long long e;
char f;
}__attribute__((aligned(8)));
struct F{
char a;
int b;
unsigned short c;
long d;
unsigned long long e;
char f;
}__attribute__((packed));
int main(int argc, char **argv)
{
printf("A = %d, B = %d, C = %d, D = %d, E = %d, F = %d/n",
sizeof(struct A), sizeof(struct B), sizeof(struct C), sizeof(struct D), sizeof(struct E), sizeof(struct F));
return 0;
}[/code]
在一個32位機上執行結果如下:
[code][root@Kendo develop]# gcc -o align align.c
[root@Kendo develop]# ./align
A = 28, B = 32, C = 28, D = 28, E = 32, F = 20[/code]
我們看到,最後一個struct F,1 + 4 + 2 + 4 + 8 + 1 = 20,因為使用了__attribute__((packed)); 來表示以最小方式對齊,所以結果剛好為20。
而第一個struct A,因為什麼也沒有跟,採用預設處理方式:4(1) + 4 + 4(2) + 4 + 8 + 4(1) = 28,括號中是其成員本來的大小。與此相似的是struct D。
接下來看struct E,採用8個位元組的方式來對齊:8(1+4+2 ,即a, b, c)+ 8(4, d) + 8 + 8(1, f) = 32。
而在struct C中,試圖使用__attribute__((aligned(1))) 來使用1個位元組方式的對齊,不過並未如願,仍然採用了預設4個位元組的對齊方式。
在struct B中,aligned沒有引數,表示“讓編譯器根據目標機制採用最大最有益的方式對齊"——當然,最有益應該是執行效率最高吧,呵呵。其結果是與struct E相同。
在對結構的大小並不關注的時候,採用預設對齊方式或者編譯器認為最有益的方式是最常見的,然後,對於一些對結構空間大小要求嚴格,例如定義一個資料包報頭的時候,明白結構的對齊方式,就非常有用了。
相關文章
- crontab對oracle操作問題處理Oracle
- 使用者和角色多對多問題,物件間關聯處理問題物件
- 圖示和文字無法對齊處理方法
- c/c++資料對齊問題C++
- GridLayout的使用及問題處理
- 結構體成員對齊的問題結構體
- 處理問題的方法
- perl中文處理問題
- 漢字處理問題?
- xml處理的問題XML
- 貨品問題處理
- [git] git問題處理Git
- Oracle CPU使用率過高問題處理Oracle
- 【問題處理】使用trim和 replace處理字串中的換行符號字串符號
- Bootstrap table使用心得---thead與td無法對齊的問題boot
- 對於數字或者字串有限的問題的處理字串
- LoadRunner字串處理 - 補齊字串字串
- C語言中結構體struct的對齊問題C語言結構體Struct
- iOS上如何讓按鈕文字左對齊問題iOS
- golang json處理問題GolangJSON
- 併發問題處理方式
- ASMCMD處理問題一則ASM
- mysql的處理能力問題MySql
- RMAN處理split block問題BloC
- mysql問題處理兩則MySql
- Oracle啟動問題處理Oracle
- mysql 問題處理二則MySql
- Oracle壞塊問題處理Oracle
- 資料處理--pandas問題
- Docker使用Calico網路模式配置及問題處理Docker模式
- vue使用的props元件傳值問題處理Vue元件
- 總結logminer使用及各種問題處理
- standby無法使用歸檔日誌問題處理
- SYSAUX表空間使用率高問題處理UX
- 多對一處理 和一對多處理的處理
- css使用transform垂直對齊CSSORM
- Atom外掛aligner冒號(:)對齊的問題
- WPS/Word中公式與文字不對齊的問題公式