最新评论

共3页: 1 2 3 下一页 
一介码夫 2012-05-27 13:37
偶像
ma6174 2012-03-25 19:35
mark
andy65007 2012-01-15 20:11
楼主你太牛了!!我也遇到了同样的问题,发现最新版Qt Creator 2.4.0在启动时会访问2个地址lillemy.nokia.kunder.linpro.no:http和hx-in-f118.1e100.net:http;导致这个IDE启动时奇慢无比,NND不知道nokia要干嘛; 经过一番折腾,发现是QtCreator的一个插件造成的:打开QtCreator.exe->帮助->关于插件->展开Qt Creator,找到Welcome插件,设置为不选中;重新启动,OK!
哥哥.Net 2011-11-16 13:51
好文好态度,读起来很嗨皮。
py前 2011-08-29 21:37
current version of qt sdk win 1.1.2 with qtcreator 2.2.1, if cmake.exe not found on system environment path, even set the cmake postion on open project section, it will make cmake based project crash qtcreator. mark it here.
紫红的泪 2011-07-19 08:46
@zhezhelin 很久以前的文章了,实际上更Qt化的方法是直接用Q_GLOBAL_STATIC。
zhezhelin 2011-07-18 17:33
还有锁也不要了!!
zhezhelin 2011-07-18 17:29
if(instance.testAndSetOrdered(0, 0))//第一次检测 这个直接用 if(!instance)就可以了
紫红的泪 2011-04-24 12:01
[quote]SoftwareTeacher: >没有分类系统的学术搜索引擎(如GS), GS 也有按学科的分类[/quote] 本篇用的tw的GS来对比的,貌似里面真没有学科分类。但是刚才试了下com的GS,在高级搜索中有学科分类。看来GS的中文支持也不是很到位呀~文章中已经做了修改。
SoftwareTeacher 2011-04-23 22:53
>没有分类系统的学术搜索引擎(如GS), GS 也有按学科的分类
紫红的泪 2011-03-08 21:50
http://blog.csdn.net/hifrog/archive/2004/07/03/33352.aspx 这篇里“成员函数指针实现”一节提到的: 编译器 选项 int DataPtr CodePtr Single Multi Virtual Unknown MSVC 无 4 4 4 4 8 12 16 其中 void*属于DataPtr,静态成员函数指针也就是C语言的普通函数指针属于CodePtr,Multi是多重继承下的成员函数指针,Virtual是虚继承下的成员函数指针。 如果我把多重继承下的成员函数指针8字节长赋值给了void*(4字节长)就丢失了一部分数据。我没试过,文中这么写的。
hoodlum1980 2011-03-08 21:19
@紫红的泪 哪里有指针类型转换丢失数据的这种说法?你把原文的描述贴出来。
紫红的泪 2011-03-08 20:32
@hoodlum1980 根据后面那三篇文章中的说法,在C++的成员函数指针的大小是不确定的,这时候转为void*有可能丢失数据呀。
hoodlum1980 2011-03-08 19:39
另外我再补充下,如果你的testThis声明成这样: void __cdecl testThis(int i); 再使用union里的to2函数调用就没有问题了(this指针这时候就通过栈传递了)。但这时候就不能用to调用。 所以本质上你的文章性质还是调用约定不一致导致的,正常情况下,函数指针都和它指向的函数保持着一致的声明(即保障他们的调用约定也一致),而不是你标题说的问题。
hoodlum1980 2011-03-08 19:00
最后我总结以下,你这篇文章的性质属于以假想的方式,从盒子内部去使用一个黑盒提供的接口(即你是在不了解底层的函数的调用约定的情况下,用自己假设的调用约定去调用类成员函数),是一种错误的编码方式,而不是所谓的“奇技淫巧”。因为本质上后者是能正确work的一种非常规方法。
紫红的泪 2011-03-08 18:54
@hoodlum1980 这个是测试代码,当然实际项目中没这么用。我也是好奇才试试看的。另外《C++对象模型》一书还未看完。我只是知道有几种调用约定,还未细看,谢谢你的汇编代码。
hoodlum1980 2011-03-08 18:54
在MSDN中还有比较重要的信息是,__thiscall 在VS2005.net之前的版本中无法显示指定。 在IPF芯片和X64的机器上,__thiscall会被编译器接受但是被忽略。所以我想这是你第一个测试环境没有弹出错误对话框的原因。
hoodlum1980 2011-03-08 18:47
备注:在我使用的环境(VC6)里,类的成员函数的默认调用约定是__thiscall; 关于这个调用约定,请注意在MSDN中的描述:“Arguments are pushed on the stack from right to left, with the this pointer being passed via register ECX, and not on the stack, on the x86 architecture.” 注意这段话表达的意思非常重要,在X86上,this指针是通过ECX传递的,而不是通过栈传递的。
hoodlum1980 2011-03-08 18:40
下面我再解释下,在B.runB中通过to的地址去调用的汇编代码: runB中,先把ecx(this指针)的值保存到函数自己所分配的栈空间上。然后在调用类的成员函数时,先把参数push到栈上,然后把已经保存到函数自己栈空间里的this指针传送到ecx,然后调用成员函数。写简单点就是类似这样: push i; mov ecx, this; call B::testThis; 而不是你说理解的: push i; push this; call B::testThis; 而且testThis的代码也是按照前者去取参数和this指针的,一旦你用你自己的理解方式去调用,那就完全是“驴唇不对马嘴”,后果我想的确是我们难以预料的。
hoodlum1980 2011-03-08 18:29
我看了下VC6 debug版本的反汇编代码,发现this指针是通过ECX寄存器传递到函数的,而不是你认为的通过栈方式传递。所以你那种调用方式显然不对。也就是说在我测试的环境里,实际上,栈顶部就是那个int参数,this在ecx里。而不是你认为的栈顶是this,this下面是int参数。(备注:完整的栈FRAME是:ebp的原值,返回时的跳转地址,参数列表) 汇编代码比较难于看懂。如下是testThis的代码: .text:00401AF0 B__testThis proc near ; CODE XREF: j_B__testThisj .text:00401AF0 .text:00401AF0 var_44 = dword ptr -44h .text:00401AF0 var_4 = dword ptr -4 .text:00401AF0 arg_0 = dword ptr 8 .text:00401AF0 .text:00401AF0 push ebp .text:00401AF1 mov ebp, esp .text:00401AF3 sub esp, 44h .text:00401AF6 push ebx .text:00401AF7 push esi .text:00401AF8 push edi .text:00401AF9 push ecx .text:00401AFA lea edi, [ebp+var_44] .text:00401AFD mov ecx, 11h .text:00401B02 mov eax, 0CCCCCCCCh .text:00401B07 rep stosd .text:00401B09 pop ecx .text:00401B0A mov [ebp+var_4], ecx .text:00401B0D push offset loc_4010DC .text:00401B12 mov eax, [ebp+var_4] .text:00401B15 push eax .text:00401B16 push offset ??_C@_04ENNO@?5?9?$DO?5?$AA@ ; " -> " .text:00401B1B mov ecx, [ebp+arg_0] .text:00401B1E push ecx .text:00401B1F mov ecx, offset std__cout .text:00401B24 call sub_401113 .text:00401B29 push eax .text:00401B2A call sub_4012AD .text:00401B2F add esp, 8 .text:00401B32 mov ecx, eax .text:00401B34 call j_std__basic_ostream_char_std__char_traits_char_____operator__ .text:00401B39 mov ecx, eax .text:00401B3B call sub_401203 .text:00401B40 pop edi .text:00401B41 pop esi .text:00401B42 pop ebx .text:00401B43 add esp, 44h .text:00401B46 cmp ebp, esp .text:00401B48 call __chkesp .text:00401B4D mov esp, ebp .text:00401B4F pop ebp .text:00401B50 retn 4 .text:00401B50 B__testThis endp
共3页: 1 2 3 下一页