| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5274 人关注过本帖
标题:指针长度由什么决定呢?
只看楼主 加入收藏
不归鹄
Rank: 9Rank: 9Rank: 9
来 自:冥王星
等 级:蜘蛛侠
威 望:4
帖 子:491
专家分:1380
注 册:2009-12-20
收藏
得分:0 
以下是引用小旬_C在2010-8-22 13:30:13的发言:

没看出什么,我太笨老
看来要版主出马了

2010-08-22 13:42
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
程序代码:
#include <stdio.h>

class base
{
public:
    virtual void func(){printf("call base::func\n");};
};
class test:public base
{
public:
    void func(){printf("call test::func\n");};
};

int main()
{
    void(base::*p)() = &base::func;
    test x;
    (x.*p) ();    // 调用的是test::func;
    base y;
    (y.*p)();    // 调用的是base::func;
    // 以下在32位机器上, VC6 下是 4, GCC4.4.1 是 8 ,CodeGear C++ 6.10 的结果是12
    printf("sizeof( void(base::*p)()) %d\n" , sizeof(p) );
    printf("sizeof( void(base::*p)()) %d\n" , sizeof(class base) );

    return 0;
}
我这个测试用例说明在不同的编译器下确实是不一样的,但是都说编译器影响,这个太笼统了!

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2010-08-22 13:54
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
    printf("sizeof( void(base::*p)()) %d\n" , sizeof(class base) );

不同的编译器这句是不一样的。 应为有对Vtab的定义不一样。
而且这句跟指针没关系。

printf("sizeof( void(base::*p)()) %d\n" , sizeof(p) );

这个是判断函数指针。 我相信不同的编译器都会有一样的结果,在同一台机器上。

因为指针大小只跟CPU字长相关。
2010-08-22 14:01
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
以下是引用Devil_W在2010-8-22 14:01:01的发言:

    printf("sizeof( void(base::*p)()) %d\n" , sizeof(class base) );
不同的编译器这句是不一样的。 应为有对Vtab的定义不一样。
而且这句跟指针没关系。

printf("sizeof( void(base::*p)()) %d\n" , sizeof(p) );
这个是判断函数指针。 我相信不同的编译器都会有一样的结果,在同一台机器上。

因为指针大小只跟CPU字长相关。
这是我实际的测试结果:
 以下在32位机器上, VC6 下是 4, GCC4.4.1 是 8 ,CodeGear C++ 6.10 的结果是12
    printf("sizeof( void(base::*p)()) %d\n" , sizeof(p) );

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2010-08-22 19:18
VxWorks
Rank: 3Rank: 3
来 自:WindRiver
等 级:论坛游民
威 望:6
帖 子:859
专家分:68
注 册:2007-11-24
收藏
得分:0 
请教一下Devil_W:
    Linux和Windows一样,IA32处理器上都区分32bit和64bit两个版本,有什么区别?32bit的Linux能管理的最大物理内存是多少,为什么?如何扩展?

为了防止世界被破坏,为了守护世界的和平,贯彻爱与真实的邪恶,可爱又迷人的反派角色,VxWorks!
Don't ask me any question.I'm just here to buy soy sauce.
2010-08-22 19:33
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
估计这下又装B装不下去了。

我就是真命天子,顺我者生,逆我者死!
2010-08-22 19:35
waterstar
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:984
专家分:2810
注 册:2010-2-12
收藏
得分:0 
指针的长度不是我们决定的吧,我们能改变的只是它的取字方式,也就是返回值类型

冰冻三尺,非一日之寒;士别三日,不足刮目相看!
2010-08-22 19:36
succubus
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:635
专家分:1080
注 册:2007-10-7
收藏
得分:0 
以下是引用VxWorks在2010-8-22 19:33:37的发言:

请教一下Devil_W:
    Linux和Windows一样,IA32处理器上都区分32bit和64bit两个版本,有什么区别?32bit的Linux能管理的最大物理内存是多少,为什么?如何扩展?
别问物理内存
毕竟物理内存还要受主板的限制,所以可以取巧地回答
直接问能管理的最大虚拟内存空间是多少

[url=http:///view/aDU1]/image/aDU1.gif" border="0" />[/url]
2010-08-22 20:34
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
是不是数据总线也会影响这个指针的大小呢 ?

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2010-08-22 23:25
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
我也觉得是编译器决定的这个。

intel 的处理器的机器语言格式,在它的手册上写的很清楚的。是靠指令的前缀码(一个机器指令至多能带有4组前缀,其中一个可以用来控制字长)决定地址的字长的,在忽略这个地址前缀的时候,用的是处理器默认的字长。但它也提供了一种有 64 位处理器运行 32 位或 16 位程序的方法。属于兼容性质的一个问题。
编译器在编译时如何生成汇编语言是它自己决定的。另外,一个编译好的编译器,也只能在指定的平台上工作。
2010-08-23 01:00
快速回复:指针长度由什么决定呢?
数据加载中...
 
   



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

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