字节对齐
来源:互联网 发布:医疗服务行业数据 编辑:程序博客网 时间:2024/06/07 02:28
字节对齐
原理分析
字节对齐的准则:
1. 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2. 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;例如上面第二个结构体变量的地址空间。
3. 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。
- Vc 编译器默认是 #pragma pack(8)
- gcc 默认是 #pragma pack(4),并且 gcc 只支持 1 / 2 / 4对齐。
- 套用三原则里计算的对齐值是不能大于 #pragma pack(value) 指定的 value 值。
实践验证
硬件平台:x86、64bit
软件平台:windows
编译器:TDM-GCC 4.9.2 64-bit Release
#include <stdio.h>int main(){ char *A; char *B[20]; char *C[20][20]; int (*D)[10]; printf("sizeof(A) = %d\n", sizeof(A)); printf("sizeof(B) = %d\n", sizeof(B)); printf("sizeof(C) = %d\n", sizeof(C)); printf("sizeof(D) = %d\n", sizeof(D)); struct str1 { char a; double b; int c; } p1; printf("sizeof(p1) = %d\n", sizeof(p1)); struct str2 { double a; char b; int c; } p2; printf("sizeof(p2) = %d\n", sizeof(p2)); #pragma pack(1) // 指定字节对齐值 struct str3 { double a; char b; int c; } p3; #pragma pack(pop) // 恢复字节对齐值 printf("sizeof(p3) = %d\n", sizeof(p3)); return 0;}
输出结果
sizeof(A) = 8
sizeof(B) = 160
sizeof(C) = 3200
sizeof(D) = 8
sizeof(p1) = 24
sizeof(p2) = 16
sizeof(p3) = 13
==================================================
1 0
- 字节对齐
- 字节对齐
- 字节对齐
- 字节对齐
- 字节对齐
- 字节对齐
- 字节对齐
- 字节对齐
- 字节对齐
- 字节对齐
- 字节对齐
- 字节对齐
- 字节对齐
- 字节对齐
- 字节对齐
- 字节对齐
- 字节对齐
- 字节对齐
- 什么是显热?什么是潜热?
- Xcode9中开发phoneGap应用ajax异常的解决办法
- Keil调试局部变量显示"not in scope"的问题解决
- 我的iOS学习历程 - UICollection详解
- Leetcode 第6题ZigZag Conversion
- 字节对齐
- PHP开发环境配置
- java并发--队列同步器原理一
- [手游新项目历程]第16天-cmake
- 1.4字符串转整数
- 有关设计的黑科技
- android5.0自带兼容控件
- 常用dos命令(四)--MD命令
- PDCA&&Me