32位和64位下结构体内存对齐问题
来源:互联网 发布:莫达非尼淘宝 编辑:程序博客网 时间:2024/05/22 04: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
内存空间实际上是连续的,上面分块的画法只是为了方便理解。
3.关于内存对齐的介绍
http://blog.csdn.net/csw_100/article/details/5495309
1 0
- 32位和64位下结构体内存对齐问题
- 32位和64位下结构体内存对齐问题
- 32位和64位下结构体内存对齐问题
- 结构体内存对齐与位域
- 经典C语言位域结构体内存对齐
- 结构体内存对齐问题
- 结构体内存对齐问题
- 结构体内存对齐问题
- 结构体内存对齐问题
- 结构体内存对齐问题
- 结构体内存对齐问题
- 结构体内存对齐问题
- [转贴]位段结构体 和 结构体内存分配问题
- 关于VC下结构体内存对齐问题
- 结构体内存对齐问题(转)
- 关于结构体内存对齐的问题
- 关于c++结构体内存对齐问题
- C语言结构体内存对齐问题
- php的执行方式、执行过程与加速工具
- gem安装gtk2出错
- 自定义jQuery插件(一)
- PHP 垃圾回收机制
- android网络编程
- 32位和64位下结构体内存对齐问题
- 解决找不到ifconfig命令,更改路径并重启系统后进入命令行界面以及各个命令无法执行Linux:-bash: ***: command not found
- C++构造与析构(11) - 析构函数的行为
- 关于XSS(跨站脚本攻击)和CSRF(跨站请求伪造)
- web.xml里<filter-mapping>中的<dispatcher>作用
- UVA - 11504 Dominos 强连通分量
- win7 能ping通dns, 但无法解析域名
- 解析 Nginx 负载均衡
- 【金蝶KIS零售版V4.2】汉码盘点机无缝对接金蝶盘点机PDA条码数据采集器