摘要:
系统基于32位,MSVC编译器,VS开发工具 1、上篇讲到菱形继承,我们发现菱形继承会导致有两份的基类TypeA子对象,因为TypeB继承了TypeA,TypeC也继承了TypeA ,所以TypeB子对象和TypeC子对象都会包含TypeA部分。 可以通过虚继承保持只有一个TypeA子对象,至于如何 阅读全文
摘要:
系统基于32位,MSVC编译器,VS开发工具 1、之前看到的都是简单一点的类型继承,现在看下另外一个例子,菱形继承(又称钻石继承)。一个TypeA基类,TypeB和TypeC继承TypeA,TypeD同时继承TypeB和TypeC。 class TypeA { public: char a1 = 1 阅读全文
摘要:
系统基于32位,MSVC编译器,VS开发工具 1、上篇直接通过类型对象调用成员函数,这种方式无法实现多态。所谓多态意思对函数的调用呈现出不同的形态。 下面这个例子中 a_ptr为指向a_obj的指针,当调用虚函数时,不再像之前一样直接调用了,而是先从虚函数表获取函数地址间接调用。 而如果是调用非虚函 阅读全文
摘要:
系统基于32位,MSVC编译器,VS开发工具 1、通过对象对成员函数的调用,默认会给参数传进去一个this指针,该指针为对象的首地址,这个过程通常被编译器隐藏起来了。 对象直接调用成员函数,编译器在编译器就会直接获取到函数地址,汇编语言生成的就是call 函数地址,会有一个寄存器(很多情况是ECX) 阅读全文
摘要:
系统基于32位,MSVC编译器,VS开发工具 1、一个简单的类型TypeA,类型对象a_obj总共占8个字节。char类型a1占1个字节,但是为了考虑到32位系统存储效率,所以a1变量后面会分配3个字节,用于内存的4字节对齐。 a2变量占用4个字节,对象a_obj的地址等于a1的地址。成员函数Typ 阅读全文
摘要:
今天看到一个很有意思的代码,一不小心,就会被绕进去,会对结果感到很奇怪,以为是编译器的bug 我们定义一个变量a,再获取一下这个变量对应的地址,后面会用到 获取到局部变量a存的地址为0028ff44,在我的C-Free上测试过,每次运行第一个局部变量都是这个地址。 例1: 执行完 *p=NULL 后 阅读全文
摘要:
指针和数组很多情况下,用法差不多,数组也被隐性转换成指针用,但是不能说数组就是指针,代表的是完全不同的东西。 定义数组的时候会分配一些类型相同的元素空间,而指针只不过是指向某一类型空间的地址而已,本身是一个数据类型,类型的值就是一个地址而已。 之所以很多情况下感觉类似,是因为数组在除了&运算符或者s 阅读全文
摘要:
指针一直是被很多人误解,包括很多书中对指针的定义也存在很大的歧义,导致看书的人越看越懵,所以指针到底是个什么东西?(注意:文中所有图片不表示实际内存大小,纯属为了画图需要) 指针是地址吗? 很显然指针不是地址,地址只是一个数值,这个数值不可能代表指针。如图 伪代码: int *ap = (int * 阅读全文
摘要:
#include <stdio.h> int main() { char *a[]={ "Hello World" }; char b[]={ 'C','D' }; printf("%c",b); printf("\n"); printf("%s",b); } C语言中的数组名,是不可修改的变量,只 阅读全文
摘要:
前一篇文章里看到在C-Free下调用gdb 可以显示源代码的汇编语言,但是默认其实不是用intel的指令格式显示的,而是用AT&T指令格式显示的汇编,如下 本人表示接触的是intel的指令,所以看这个总是怪怪的,我们可以在控制台命令里面输入 set disassembly-flavor intel 阅读全文