this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。例如,调用date.SetMonth(9)=== SetMonth...
(1)从图1可以发现this指针通过ECX寄存器,传递给了成员函数。this指针就是对象的地址。 图1 Main函数 (2)从图 2可以发现访问对象的成员变量用的就是之前通过ECX传入的this指针。 图2 show()函数 三、深入理解 通过截图及相关的资料,可以很清晰的知道在调用构造函数、show()函数之前的那个ECX就是this指针,也就是...
其规则是:参数从右向左压入堆栈,x86构架下this指针通过ECX寄存器传递,函数退出时由callee清理堆栈中的参数,x86构架下this指针通过ECX寄存器传递。同样不支持可变数量的参数。如果显式地把类成员函数声明为使用__cdecl或者__stdcall,那么,将采用__cdecl或者__stdcall的规则来压栈和出栈,而this指针将作为函数的第一个参...
对于隐式的this指针,生成的汇编代码需要先分配栈空间,保存this指针到rcx寄存器中,再将42赋值到data_中,然后调用foo(),最后平栈。 而以值形式传递this,则无需那些操作,因为值传递的this不会影响s变量,中间的步骤都可以被优化掉,也不再需要分配和平栈操作,所以可以直接将42保存到寄存器当中,再jmp到foo()处执行。
指针的本意就是内存地址,我们可以通俗地理解成内存编号,既然计算机通过编号来操作内存单元,这就造就了指针的高效率。 那么什么是指针变量呢?指针变量可通俗地理解成存储指针的变量,也就是存储内存地址(内存编号)的变量。首先指针变量和整型变量、字符型变量以及其他数据类型的变量一样都是变量类型;但是,反过来,我们不应...
译者注:访问局部变量,需要到SP寄存器中得到栈指针,再加上局部变量与栈顶的偏移。在没有虚基类的情况下,如果编译器把this指针缓存到了寄存器中,访问成员变量的过程将与访问局部变量的开销相似。 5.1 覆盖成员函数 和成员变量一样,成员函数也会被继承。与成员变量不同的是,通过在派生类中重新定义基类函数,一个派生类...
对,就是指针,你可以这样: int *pa = &a; pa 中存储的就是变量a的地址,也叫做指向a的指针。 在这里我想谈几个看起来有点无聊的话题: 为什么我们需要指针?直接用变量名不行吗? 当然可以,但是变量名是有局限的。 变量名的本质是什么? 是变量地址的符号化,变量是为了让我们编程时更加方便,对人友好,可计算机...
this 指针是一个隐含于每一个非静态成员函数中的特殊指针。它指向正在被该成员函数操作的那个对象。 当对一个对象调用成员函数时,编译程序先将对象的地址赋给 this 指针,然后调用成员函数,每次成员函数存取数据成员时,由隐含使用 this 指针。 当一个成员函数被调用时,自动向它传递一个隐含的参数,该参数是一个指向...
2)栈:char s1[]=”hellowtigerjibo”;是在运行时赋值的;用数组比用指针速度更快一些,指针在底层汇编中需要用edx寄存器中转一下,而数组在栈上读取。 补充: 栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是...
类的普通函数与虚函数在CPU眼里是完全一致的。虚函数和普通函数一样,都会夹带一个隐藏参数,this指针。 对象调用类的普通函数和对象调用类的虚函数,唯一的区别是,对象调用类的普通函数时,call指令的目标地址在编译阶段就确定了,也就是静态绑定,但调用虚函数时,call指令只能根据rdx寄存器的值来确定函数的值,也就是所...