32位和64位下结构体内存对齐问题
来源:互联网 发布:sql 当前时间减1分钟 编辑:程序博客网 时间:2024/05/21 19:31
1.先看64位下:
#include<stdio.h>struct A{ int a; char b; double c; char d;};struct B{ char a; double b; char c;};int main(){ printf("int =%lu,char=%lu,double=%lu\n",sizeof(int),sizeof(char),sizeof(double)); printf("structA=%lu structB=%lu\n",sizeof(struct A),sizeof(struct B)); return 0;}
输出结果:
structA: 4+(1+3)+8+(1+7) = 24
structB: (1+7)+8+(1+7) = 24
计算结果与输出是一样的。
这两个结构体在内存中存储应该是下面这样的:
struct A: 整体按照8字节(double长度)对齐
struct B :
2.在32位下编译,gcc 加参数 -m32
#include<stdio.h>struct A{ int a; char b; double c; char d;};struct B{ char a; double b; char c;};int main(){ printf("int =%u,char=%u,double=%u\n",sizeof(int),sizeof(char),sizeof(double)); printf("structA=%u structB=%u\n",sizeof(struct A),sizeof(struct B)); return 0;}
输出:
结果和64位下完全不一样,很显然它没有按照最长成员double的8字节对齐。稍微想一下就明白了,因为32位只有4个字节,最长对齐模数只能按4个字节来对齐,double 是分成了2个4字节。上面两个结构体在内存中应该是这种形式。
struct A:整体按照4字节对齐
4+(1+3)+8+(1+3) = 20
struct B :
(1+3)+8+(1+3) = 16
内存空间实际上是连续的,上面分块的画法只是为了方便理解。
0 0
- 32位和64位下结构体内存对齐问题
- 32位和64位下结构体内存对齐问题
- 32位和64位下结构体内存对齐问题
- 结构体内存对齐与位域
- 经典C语言位域结构体内存对齐
- 结构体内存对齐问题
- 结构体内存对齐问题
- 结构体内存对齐问题
- 结构体内存对齐问题
- 结构体内存对齐问题
- 结构体内存对齐问题
- 结构体内存对齐问题
- [转贴]位段结构体 和 结构体内存分配问题
- 关于VC下结构体内存对齐问题
- 结构体内存对齐问题(转)
- 关于结构体内存对齐的问题
- 关于c++结构体内存对齐问题
- C语言结构体内存对齐问题
- Bootstrap modal 多弹窗之叠加关闭阴影遮罩问题
- android studio根据配置打不同功能的apk
- 将单个字节数据读取到一个float类型的数据中---的几种方法
- nginx 安装配置教程
- 2017年最新的25个库
- 32位和64位下结构体内存对齐问题
- kettle安装启动注意事项
- JS实现图片动态轮播效果
- 欢迎使用CSDN-markdown编辑器
- End-To-End Memory Networks 论文翻译
- static特别用法【静态导包】——Java包的静态导入
- 微信公众号二次开发(2)
- ORACLE常用性能SQL
- DateTables属性值设置