| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2572 人关注过本帖
标题:结构体在内存的中如何存放(如何让字节对齐)?
只看楼主 加入收藏
wujieru
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:1
帖 子:1108
专家分:1939
注 册:2010-10-9
收藏
得分:0 
以下是引用我菜119在2010-11-30 17:35:54的发言:

你的这个答案是错的,起码在vc++中就是错的!你根本就不知道内存对齐是怎么回事!!!觉得你好像一个小丑!
你一位很了不起啊你 你其实就是小丑
2010-11-30 17:56
xiaomarn
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:348
专家分:2026
注 册:2009-3-18
收藏
得分:0 
应该是float与double之间对齐的问题,对浮点数存储还没学好,只知道浮点运算是不在主处理器中的
是协处理器计算的,8个单元。。。跟堆栈很相似
2010-11-30 18:02
wujieru
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:1
帖 子:1108
专家分:1939
注 册:2010-10-9
收藏
得分:0 
以下是引用xiaomarn在2010-11-30 18:02:04的发言:

应该是float与double之间对齐的问题,对浮点数存储还没学好,只知道浮点运算是不在主处理器中的
是协处理器计算的,8个单元。。。跟堆栈很相似
你如果不知道 就别再献丑了 免得人家喷你
2010-11-30 18:02
venus85
Rank: 6Rank: 6
等 级:侠之大者
帖 子:159
专家分:477
注 册:2010-11-27
收藏
得分:0 
大家别光顾着吵架忘了回答问题了,呵呵,是讨论的,菜鸟就来说说自己的看法,大神就来指导指导。河蟹!!河蟹!!
2010-11-30 18:08
wujieru
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:1
帖 子:1108
专家分:1939
注 册:2010-10-9
收藏
得分:0 
是那个该死的119先骂人的
2010-11-30 18:10
我菜119
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:938
专家分:1756
注 册:2009-10-17
收藏
得分:8 
vc++中的编译器默认的对齐字节数是8个字节,那么变量是按照一个什么样的方式存储在内存中的呢??是按照有效对齐字节数存储的,什么是有效内存对齐字节数呢?即指定的内存对齐字节数与自身的内存对齐字节数二者之间取小,比如下面这个结构体:

struct abc
    {
      int a;
      char rfu; /*预留字节*/
     char b[3] ;
     float c;
      double d;
    } i , j;

int a的有效内存对齐字节数是4(编译器默认的是8,而a自身内存对齐字节数是4 ,二者取小就是4 ) ,那么对于a来说就必须要对齐到内存地址值是4的倍数的地址上,同样的道理char rfu 的内存对齐字节数是1 ,float c内存对齐字节数是8 , double d内存对齐字节数也是8 ; 对于char b[3]这个char类型的数组来说它的对齐是按照char类型的有效对齐字节数对齐也就是对齐到地址值是1的倍数的地址上(也就是任意的地址上),

假设从地址00开始存储的话:
那么这个结构体的内存存储形式是:
00 01 02 03  04   05   06   07   08  09  0A  0B  0C  0D  0E  0F  10  11  12  13  14  15  16  17 (地址是十六进制的)
a            rfu  b[0] b[1] b[2] c                               d              

最后还要保证这个结构体也要对齐,结构体的内存对齐字节数是该结构体成员中的有效内存对齐字节数与默认的内存对齐字节数中取大的那个,也就是8 ,整个结构体的字节数是24 ,正好能够被8圆整!因此这个结构体的字节数是24 !

愿用余生致力编程
2010-11-30 18:31
venus85
Rank: 6Rank: 6
等 级:侠之大者
帖 子:159
专家分:477
注 册:2010-11-27
收藏
得分:0 
以下是引用我菜119在2010-11-30 18:31:25的发言:

vc++中的编译器默认的对齐字节数是8个字节,那么变量是按照一个什么样的方式存储在内存中的呢??是按照有效对齐字节数存储的,什么是有效内存对齐字节数呢?即指定的内存对齐字节数与自身的内存对齐字节数二者之间取小,比如下面这个结构体:

struct abc
    {
      int a;
      char rfu; /*预留字节*/
     char b[3] ;
     float c;
      double d;
    } i , j;

int a的有效内存对齐字节数是4(编译器默认的是8,而a自身内存对齐字节数是4 ,二者取小就是4 ) ,那么对于a来说就必须要对齐到内存地址值是4的倍数的地址上,同样的道理char rfu 的内存对齐字节数是1 ,float c内存对齐字节数是8 , double d内存对齐字节数也是8 ; 对于char b[3]这个char类型的数组来说它的对齐是按照char类型的有效对齐字节数对齐也就是对齐到地址值是1的倍数的地址上(也就是任意的地址上),

假设从地址00开始存储的话:
那么这个结构体的内存存储形式是:
00 01 02 03  04   05   06   07   08  09  0A  0B  0C  0D  0E  0F  10  11  12  13  14  15  16  17 (地址是十六进制的)
a            rfu  b[0] b[1] b[2] c                               d              

最后还要保证这个结构体也要对齐,结构体的内存对齐字节数是该结构体成员中的有效内存对齐字节数与默认的内存对齐字节数中取大的那个,也就是8 ,整个结构体的字节数是24 ,正好能够被8圆整!因此这个结构体的字节数是24 !
这个地方我加入了 char rfu;刚好能使最后的整个结构体字节数为24,要是去掉这个,也就是说最后的整个结构体的字节数不为结构体成员中的有效内存对齐字节数中取大的那个的整数倍,那从哪里补齐呢?是在最后,也就是d后面会自动补上一个char类型吗?
最后,感谢119的回答,但是如果你说话能含蓄点,别见人理解有误就“潇洒”的给人“小丑”,“二”之类的评价,我觉得可能会更好。你说呢?
2010-11-30 19:40
vandychan
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
等 级:贵宾
威 望:18
帖 子:2296
专家分:6418
注 册:2010-8-20
收藏
得分:0 
有时候谦虚和真诚 说不清楚了

到底是“出来混迟早要还”还是“杀人放火金腰带”?
2010-11-30 19:56
我菜119
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:938
专家分:1756
注 册:2009-10-17
收藏
得分:0 
00 01 02 03  04   05   06   07   08  09  0A  0B  0C  0D  0E  0F 10  11  12  13  14  15  16  17 (地址是十六进制的)
a            b[0] b[1] b[2] cc    c                              d              

如果你没有加那个char rfu的话就会在后面添加一个字节,这是因为要保证float f这个数据对齐到地址值是8的地址上,因为其内存对齐字节数是8 ,这样仍然是24个字节!

[ 本帖最后由 我菜119 于 2010-11-30 20:02 编辑 ]

愿用余生致力编程
2010-11-30 20:01
venus85
Rank: 6Rank: 6
等 级:侠之大者
帖 子:159
专家分:477
注 册:2010-11-27
收藏
得分:0 
呵呵,这下懂了,谢谢你哦,119.分给你了
2010-11-30 20:32
快速回复:结构体在内存的中如何存放(如何让字节对齐)?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.068006 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved