typedef unsigned long DWORD
typedef int BOOL
typedef unsigned char BYTE
typedef unsigned short WORD
typedef float FLOAT
typedef FLOAT *PFLOAT
typedef BOOL near *PBOOL
typedef BOOL far*LPBOOL
typedef BYTE near *PBYTE
typedef BYTE far*LPBYTE
typedef int near*PINT
typedef int far *LPINT
typedef WORD near *PWORD
typedef WORD far*LPWORD
typedef long far*LPLONG
typedef DWORD near *PDWORD
typedef DWORD far *LPDWORD
typedef void far*LPVOID
typedef CONST void far *LPCVOID
typedef int INT
typedef unsigned intUINT
typedef unsigned int*PUINT
不可以。
是。
是。
你这个疑问就实际上涉及到了编译技术。this指针你会发现他是C++的关键字凯烂,而不是在那个头文件里声明的变量。也就是说,this指针并不是一个真实存在的C++语言变量,“父类指针不能自动(隐式)转换为子类指针”实际上是C++语言的变量类型规则,但this指针并非一个变量,所以不需要遵循此规则。从执行中的程序来说,this指针是帮助函数确定对象的位置。
如果非要问,this指针到底是储存在哪里?你去看百度百科,它是这样说的“不存在所谓的this的“位置”,只是this表示了对象的存储位置而已。&this违反语义规则,是错误的用法,不会编译通过。”当然,这是从C++语言的层面上来谈。在程序运行中,其实确实是有一个地方储存this指针的值的,不过这只有在非静态函数被调用才存在的。在X86处理器中,储存这个值的地方是寄存器ecx,X86-64储存这个值的地方是rcx。下面给出例子。
void G(IA* a){
a->F()
}
这段对应的汇编语言重点如下:
mov rcx, [rsp+28h+arg_0] <——这里就是把对象的首地址(就是变量a的值)放在rcx中。
call qword ptr [rax] <——调用F()函数。
virtual void F(){
this->member++
}
mov [rsp+arg_0], rcx <——将rcx(其实就是所谓this指针)压进栈以防rcx寄存器有他用。
mov rax, [rsp+arg_0]
mov eax, [rax+0Ch] <——通过this指针找到成员变侍带量member的位置。
inc eax <——执行自增 *** 作。
看到了老孙芦吧,this指针不过就是类成员函数被调用时,被临时储存到rcx寄存器的对象首地址。
之所以啰嗦这么多,意思就是让你明白(如果你被上面所述搞得一头雾水),从程序实际运行的角度上看,this指针与其说是C++的指针,还不如说是编译技术里的东西,汇编/机器语言里根本没有类型一说(当然,机器最多分整数运行储存单元和浮点数运算储存单元),自然不存在什么类型转换了。
字这个概念,非常有意思字呢,没有正统被规定过到底是什么意思
但是根据微软的习惯,慢慢这种叫法也被延续了下来,在微软的数据命名中
一个字节的叫字节,两个字节的叫WORD,4个字节的叫DWORD,8个字节的叫QWORD
另外吵逗还有一个概念 ,叫 “字长”
字长,一般来讲是CPU能单次处理的数据长度,基本上就等于是通用寄存器的长度
至于历史上为什么把两个字节叫成WORD,很可能跟历史贺斗原因有关,8086 这块CPU是16位CPU,当初DOS盛行,在那个年代 字=WORD=2字节
这种叫法很可能因为微软头文件里的数据类型命名(WORD,DWORD,QWORD)而保留至今
可能因为这个关系,现如今一个字,还是被通常认为是2字节
但是严格来讲,字=字长=CPU通用寄存器长度
所以,字,这个概念,本来就是有歧义的,你明白其中原理就行,不升拍卖用在乎到底是什么意思,你贴的图里,它就是1个机器字长的意思
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)