字节对齐测试实例
先看理論:
1. 更改C編譯器的缺省字節(jié)對(duì)齊方式
在缺省情況下,C編譯器為每一個(gè)變量或是數(shù)據(jù)單元按其自然對(duì)界條件分配空間。一般地,可以通過(guò)下面的方法來(lái)改變?nèi)笔〉膶?duì)界條件:
· 使用偽指令#pragma pack (n),C編譯器將按照n個(gè)字節(jié)對(duì)齊。
· 使用偽指令#pragma pack (),取消自定義字節(jié)對(duì)齊方式。
另外,還有如下的一種方式:
· __attribute((aligned (n))),讓所作用的結(jié)構(gòu)成員對(duì)齊在n字節(jié)自然邊界上。如果結(jié)構(gòu)中有成員的長(zhǎng)度大于n,則按照最大成員的長(zhǎng)度來(lái)對(duì)齊。
· __attribute__ ((packed)),取消結(jié)構(gòu)在編譯過(guò)程中的優(yōu)化對(duì)齊,按照實(shí)際占用字節(jié)數(shù)進(jìn)行對(duì)齊。
?
測(cè)試源碼:
#include <stdio.h> #include <iostream> #include <map>using namespace std;struct stu {char sex;long long ss; // 8short length; // 2int s2; // 4char name[10]; //}__attribute__((aligned(1))); // 按最大成員的長(zhǎng)度來(lái)對(duì)齊(但不超過(guò)N,否則按N對(duì)齊;N=4(32位機(jī)器)/8(64位機(jī)器)) }__attribute__((packed)); // 1字節(jié)對(duì)齊void test() {struct stu my_stu;cout << sizeof(my_stu) << endl;printf("%p, %p, %p, %p, %p\n", &my_stu.sex, &my_stu.ss, &my_stu.length, &my_stu.s2, &my_stu.name); }int main() {test(); return 0; }測(cè)試結(jié)果與我代碼中的注釋一致,代碼本身也比較簡(jiǎn)單,就不解釋了!
總結(jié)
- 上一篇: Lowagie 导出html的内容到 p
- 下一篇: redhat配置centos的yum源