游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3150|回复: 9

指针类型的转换

[复制链接]

95

主题

1089

帖子

3301

积分

论坛元老

Rank: 8Rank: 8

积分
3301
QQ
发表于 2013-2-25 10:01:46 | 显示全部楼层 |阅读模式
指针类型的转换 是在编译的时候进行的 还是 在运行的时候进行的 ?
如:
char a=0;
int b=0;

b=(int)a;  //我就是问这个

3

主题

81

帖子

209

积分

中级会员

Rank: 3Rank: 3

积分
209
QQ
发表于 2013-2-25 16:43:57 | 显示全部楼层
这个好像不是指针吧?
b = (int)a;一般是在编译的时候进行的。一个简单的方法,你可以尝试下 b = (string)a;如果编译器报错了,那就是编译时进行的。

运行时进行的一般称之为 动态绑定。比如说
class A
{
public:
     virtual void print() { printf("I am A"); }
};
class B : public A
{
public:
     virtual void print() { printf("I am B"); }
}

int main()
{
   A* a = new B; //此处也为运行时确定。编译时,还是按照 A 来查找错误。
   a->print();//此处为运行时确定,即动态绑定。
}

点评

不能說編譯能提示錯誤,就是編譯時進行!  发表于 2013-2-25 22:17

0

主题

3

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2013-2-25 17:56:29 | 显示全部楼层
怎么把简单的事搞得那么复杂

3

主题

81

帖子

209

积分

中级会员

Rank: 3Rank: 3

积分
209
QQ
发表于 2013-2-26 10:52:00 | 显示全部楼层
allenlikeu 发表于 2013-2-25 16:43
这个好像不是指针吧?
b = (int)a;一般是在编译的时候进行的。一个简单的方法,你可以尝试下 b = (string) ...

确实,说错了。编译时能提示错误的,不一定是编译时确定。

谢谢niexuchina指正。

95

主题

1089

帖子

3301

积分

论坛元老

Rank: 8Rank: 8

积分
3301
QQ
 楼主| 发表于 2013-2-28 12:17:42 | 显示全部楼层
allenlikeu 发表于 2013-2-25 16:43
这个好像不是指针吧?
b = (int)a;一般是在编译的时候进行的。一个简单的方法,你可以尝试下 b = (string) ...

您说的非常好,但这种情况我还是不能确定是运行还是编译的时候执行:
int main()
{
   A* a = new B; //此处也为运行时确定。编译时,还是按照 A 来查找错误。

  ((B*)a)->print(); //前面的A转换成B是什么时候执行的,
//一个非常大的程序有必要计算这个转换时间的,如果是运行执行那么就不太好
}

3

主题

81

帖子

209

积分

中级会员

Rank: 3Rank: 3

积分
209
QQ
发表于 2013-2-28 13:42:24 | 显示全部楼层
huangjinlu 发表于 2013-2-28 12:17
您说的非常好,但这种情况我还是不能确定是运行还是编译的时候执行:
int main()
{

这个一般在VS编译器下,还是编译时确定的。

现在的C++标准不是有 dynamic_cast<>之类的么?这个能明确指定在运行时执行。
类似的还有static_cast。

86

主题

2251

帖子

2384

积分

金牌会员

Rank: 6Rank: 6

积分
2384
QQ
发表于 2013-3-3 15:40:36 | 显示全部楼层
肯定是编译时。而且实际上有的转换只是停留在C/C++语义上,不一定真的产生特别的代码,因为汇编/机器代码的层面上只有寻址的语义而没有明显的类型转换的语义。

动态绑定和类型转换是两把事,动态是指运行时才在虚表上进行动态查找。

有些做得好的编译器,比较智能,能发现一些运行时才会出现的问题。编译时错误主要是语法错误。

95

主题

1089

帖子

3301

积分

论坛元老

Rank: 8Rank: 8

积分
3301
QQ
 楼主| 发表于 2013-3-4 15:05:52 | 显示全部楼层
funcman 发表于 2013-3-3 15:40
肯定是编译时。而且实际上有的转换只是停留在C/C++语义上,不一定真的产生特别的代码,因为汇编/机器代码的 ...

谢谢,你解决了我的问题,真没见过汇编有转换类型的。

上上楼说的dynamic_cast,谢谢指教,也许以后用得着,不过我觉得这会让程序变得复杂,还是尽量不用为好,因为既然知道这里可能潜伏问题了就没必要dynamic_cast,直接改写就可以.

0

主题

7

帖子

68

积分

注册会员

Rank: 2

积分
68
发表于 2013-3-20 13:55:10 | 显示全部楼层
dynamic_cast还能很有用的,比如指针转换到子类型,但是要注意是否转换成功了

23

主题

515

帖子

552

积分

高级会员

Rank: 4

积分
552
发表于 2013-3-24 20:27:46 | 显示全部楼层
类型只是表示数据的长度。也是编译时确定的。

都是编译时代码就确定了,虚函数调用大概是如此。

MOV EDX,DWORD PTR DS:[ECX]
MOV EAX,DWORD PTR DS:[EDX+0x2C]
CALL EAX


ECX不同,最后调用的EAX必然不同。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-12 18:06

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表