| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1090 人关注过本帖
标题:简单程序~关于内存对齐的问题~请大神解答!
只看楼主 加入收藏
S140131022
Rank: 2
来 自:重庆邮电大学
等 级:论坛游民
帖 子:205
专家分:35
注 册:2014-10-9
结帖率:90.24%
收藏
已结贴  问题点数:20 回复次数:7 
简单程序~关于内存对齐的问题~请大神解答!
#include <stdio.h>
#include <malloc.h>

#pragma pack(8)

int main()
{
    char s1[] = {'H', 'e', 'l', 'l', 'o'};
    int i = 0;
    char s2[] = {'W', 'o', 'r', 'l', 'd'};
    char* p0 = s1;
    char* p1 = &s1[3];
    char* p2 = s2;
    int* p = &i;
   
    printf("%d\n", p0 - p2);

   
    return 0;
}

//结果为何是 16 、、、 能不能告诉我是肿么计算的~
搜索更多相关主题的帖子: include return 
2016-03-04 09:47
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:7 
第一,上面的#pragma pack(8)对下面是不起作用的,它只对struct起作用
第二,局部变量的排布是彻彻底底的未规定,标准甚至都不要求其存在,梦话。
2016-03-04 10:00
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:7 
楼主的系统应该是64位的,我的计算结果是12.

能编个毛线衣吗?
2016-03-04 11:00
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
收藏
得分:7 
我的是64位的,结果是28.
2016-03-04 11:03
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
回复 4楼 grmmylbs
这只能说明你的编译器是32位的,在64位系统下以兼容32位的模式运行,因为28是4的倍数,不是8的倍数。

能编个毛线衣吗?
2016-03-04 11:26
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
跟32/64有个鸟关系呀?
VC9.0 debug,我这里输出 28
VC9.0 release,我这里输出 -8
MinGW debug,我这里输出 12
MinGW release,我这里输出 -5
而且以上输出都是不确定的,更改一些优化参数就导致结果不一样。
2016-03-04 12:13
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
回复 6楼 rjsp
别激动嘛!
如果是在栈里定义变量,变量地址和操作系统位数有一定关系,因为栈指针的移动只能是“操作系统位数/8”的倍数,32位系统栈指针只能按4的倍数移动,所以编译器按“操作系统位数/8”的倍数分配空间(vc在栈内和栈外都是这样分配的,开启优化就不知道了)可以简单确保栈指针正确。
当然,编译器也完全可以直接根据变量实际大小分配空间,因为栈指针ESP只在入出栈时使用,尽管不能够执行"mov esp,1"的指令,但另一个指针寄存器ebp是可以的,变量寻址通常使用它,这时只要在定义变量时保证栈空间是“操作系统位数/8”的倍数就行了,rjsp版主所说的“不确定”就是这种情况吧,追求这个“确定”可能真的无意义!

[此贴子已经被作者于2016-3-4 13:14编辑过]


能编个毛线衣吗?
2016-03-04 13:13
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
我説過很多次,這種問題是不需要考究的,總不聽。

授人以渔,不授人以鱼。
2016-03-05 09:27
快速回复:简单程序~关于内存对齐的问题~请大神解答!
数据加载中...
 
   



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

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