[其它] 虽不合道理,但确能够正常执行的代码

jack 2006-11-20
用VC8编译下来,能够运行,输出foo,估计是编译器做了手脚

class A
{
public:
	
	void foo()
	{
		printf("foo");
	};
};

int _tmain(int argc, _TCHAR* argv[])
{
	
	
	A *a  = new A;
	a = NULL;
	a->foo();	
	return 0;
}
bigpanda 2006-11-20
邪了门了,不但VC8下面编译运行通过,我在Solaris上面用g++,CC都试了一遍,都工作。简直反了。

ddd,这里邪门的地方是运行也通过,不信你试试。btw,你不打自招干什么?
jack 2006-11-20
当然如果类中用到了this指针,运行的时候就会出错了。不过外面null指针调用,怎么运行对的,就搞不明白了
bigpanda 2006-11-20
想明白了,这几年java用多了,好多东西忘了。

member function在C++里是这么实现的,foo给改写成这个:

void _foo(A* this);

因为在foo里面没有用到A* this,所以跑的好好的。
qiezi 2006-11-23
bigpanda 写道
想明白了,这几年java用多了,好多东西忘了。

member function在C++里是这么实现的,foo给改写成这个:

void _foo(A* this);

因为在foo里面没有用到A* this,所以跑的好好的。

this作为一个参数是C++对象模型那本书里说的,现在的编译器应该都是使用thiscall,从寄存器传递this参数,是由调用者完成的。这时的this指针值是0,输出一下就可以看到,任何对空指针的解引用操作都会再现相同的段错误。
bigpanda 2006-11-23
qiezi的编译器的功力真高,佩服。

能否讲讲thiscall到底怎么工作的,或给几个链接也行。

xruby进行如何?有人说java虚拟机的instruction不适合实现Continuation,你对这条怎么看?
qiezi 2006-11-24
http://blog.vckbase.com/arong/archive/2004/06/09/409.aspx
这里有讲到thiscall。

xruby目前在整合一个新的runtime,我不接触这部分,但这部分影响到builtin的实现方式,所以我这几天已经暂停了,刚好闲下来打算看看parrot。

Continuation在java中是可以实现的,粗略看过cruby的实现,callcc时保存本地变量,call时恢复本地变量并切换到那个执行点,这在java中应该是可以一样去实现吧,只是猜想,我没有深入研究,“切换到那个执行点”应该还是有相当难度,是否能够实现我也说不清楚,有时间再仔细看看cruby的实现。
moniker 2006-11-25
这有什么不合道理的呀。呵呵。其实没那么麻烦:
#include <iostream>
class A
{
public:
    void foo(){std::cout<<"demo"<<std::endl;}
};

int main(void)
{
  ((A*)(0))->foo();
}

连分配内存都不用……。并且这是完全符合标准的用法,编译不过去才有问题呢。

因为只有在引用到变量的时候,this指针才会解引用。这种技巧在Herb Sutter的书里有很多,有点变态啊。
moniker 2006-11-25
教条一下哈。真正的C++顽固分子,上面这句应该写:
int main(void)
{
  static_cast<A*>(0)->foo();
}
bigpanda 2006-11-25
moniker 写道
教条一下哈。真正的C++顽固分子,上面这句应该写:
int main(void)
{
  static_cast<A*>(0)->foo();
}


C++高手,横空出世,以后热闹了。
Global site tag (gtag.js) - Google Analytics