C/C++中的结构体的字节对齐和#paragma pack (n)编译命令
来源:互联网 发布:提问的软件 编辑:程序博客网 时间:2024/04/30 15:03
- 结构体的字节对齐方式
- typedef struct _TEST{
- char c1;
- short s;
- float f;
- char c2;
- }TEST;
测试代码如下:
- #include <stdio.h>
- typedef struct _TEST{
- char c1;
- short s;
- float f;
- char c2;
- }TEST,*PTEST;
- int main(){
- int i;
- char* p;
- TEST t = {'a',1,2.0,'b'};
- printf("The base adress of the struct t: &t = 0x%xd/n", &t);
- printf("The first element address: &t.c1 = 0x%xd/n", &t.c1);
- printf("The size of the struct t: sizeof(t) = %d/n", sizeof(t));
- printf("The memory of the struct: ");
- p = (char*)&t;
- for( i = 0; i < sizeof(t); printf("%x ",p[i++]));
- printf("/n");
- return 0;
- }
- Output:
- The base adress of the struct t: &t = 0x12ff6cd
- The first element address: &t.c1 = 0x12ff6cd
- The size of the struct t: sizeof(t) = 12
- The memory of the struct: 61 ffffffcc 1 0 0 0 0 40 62 ffffffcc ffffffcc ffffffcc
从测试代码的运行结果中我们可以看到,结构体的基址和第一个成员的地址是一样的。根据结构体的字节对齐规则,结构体的总字节数 sizeof(t) = 12,通过打印结构体t的内存情况我们可以看到它在第一个成员c1后填充了一个字节,在第三个成员后填充了3个字节。
2. 更改C编译器的缺省字节对齐方式
在缺省情况下,C编译器为每一个变量或是数据单元按其自然对界条件分配空间。一般地,可以通过下面的方法来改变缺省的对界条件:
- 使用伪指令#pragma pack (n),C编译器将按照n个字节对齐。
- 使用伪指令#pragma pack (),取消自定义字节对齐方式。
另外,还有如下的一种方式:
- __attribute((aligned (n))),让所作用的结构成员对齐在n字节自然边界上。如果结构中有成员的长度大于n,则按照最大成员的长度来对齐。
- __attribute((packed)),取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。
同样是上面这个TEST结构,我们用#pragma pack(1)指令后,即
- #pragma pack(1)
- typedef struct _TEST{
- char c1;
- short s;
- float f;
- char c2;
- }TEST,*PTEST;
- #pragma()
- //sizeof(TEST) = 8
- C/C++中的结构体的字节对齐和#paragma pack (n)编译命令
- C语言的字节对齐 #pragma pack(n)2
- C语言中的结构体字节对齐
- C-043.结构体的储存细节,以及#pragma pack(n)对齐方式
- (C)字节对齐#pragma pack()
- C语言结构体的字节对齐
- C语言结构体的字节对齐
- C语言结构体的字节对齐
- C语言结构体的字节对齐
- ·通过#pragma pack(n)改变C编译器的字节对齐方式
- 通过#pragma pack(n)改变C编译器的字节对齐方式
- 通过#pragma pack(n)改变C编译器的字节对齐方式
- 通过#pragma pack(n)改变C编译器的字节对齐方式
- 通过#pragma pack(n)改变C编译器的字节对齐方式
- 通过#pragma pack(n)改变C编译器的字节对齐方式
- 通过#pragma pack(n)改变C编译器的字节对齐方式
- 通过#pragma pack(n)改变C编译器的字节对齐方式
- 通过#pragma pack(n)改变C编译器的字节对齐方式
- List中的set方法和add方法
- dnn中模块间的通讯机制
- 汉字内码漫谈
- 学习windows powershell(文件系统导航)
- 转载:SQL SERVER性能优化综述
- C/C++中的结构体的字节对齐和#paragma pack (n)编译命令
- Gloomy对Windows内核的分析(研究CreateProcess)
- 开发DSP硬件驱动程序的一种方法
- [转载]油阻焊热转印制做全攻略
- 解决solaris /home无法创建目录问题
- Gloomy对Windows内核的分析(内核反汇编技术)
- 9月初学习计划
- ajax:prototype.js很全的手册
- Gloomy对Windows内核的分析(系统调用接口)