剑指offer(一) 编程语言 sizeof typedef 赋值运算符函数 总结

来源:互联网 发布:淘宝买家达到钻号 编辑:程序博客网 时间:2024/06/11 15:41

以前的很多笔记都是通过私人笔记保存了,面试的时候问到我的博客或者GitHub,很尴尬竟然没有写,所以打算把找工作的阅读的一些经验分享出来,内容不是特别详细的教程方式,主要是总结性质,希望大家也可以一起进步。

编程语言c++

1、sizeof (操作符、内存对齐、实例、虚函数)

2、typedef

3、赋值运算符函数


1、sizeof:查询对象或类型的大小,在需要知道对象的实际大小时使用。操作符(operator),作用就是返回一个对象或者类型所占的内存字节数。
sizeof的主要问题:内存对齐、虚指针内存布局
sizeof的主要对象:
  1. 基本数据类型的sizeof
  2. 结构体的sizeof
  3. 联合体的sizeof
  4. 指针的sizeof
  5. 函数的sizeof (结果是函数返回值类型的大小
  6. 类的sizeof
1&2&3 的问题主要考虑内存对齐。4 主要区分sizeof strlen针对字符串的区别。
6类的sizeof相对复杂,因为涉及存在虚指针内存布局的情况类的sizeof可以细分为3类:
  1. 只有数据成员的对象
  2. 没有虚函数的对象(实例 类体
  3. 拥有虚函数的类对象
情况1和基本数据类型的sizeof一样处理。
情况2注意,实例对于sizeof的影响。在Student1中,union AA被实例化了。而在Student2中,union AA 并没有实例化。
基于typedef 的Student3 网上讨论的挺多,但是我个人认为并不影响sizeof。

情况3针对拥有虚函数的类对象。引用一个大神对虚函数机制的介绍 (主要为了实现运行时的动态绑定,多态)

http://blog.csdn.net/hackbuteer1/article/details/7883531

这里是虚函数sizeof的一个例子(vs2013,不同的编译器可能有区别,和实现有关)



内存布局:



很明显可以看到这里的a是4字节, 但是b是16字节。  b=a+4(vptr 对应B本身的虚拟表)+4(???) ,vs2013的内存布局里面这4个字节并没有体现出来。

博客上的解释是:对于虚继承,类B因为有自己的虚函数,所以它本身有一个虚指针,指向自己的虚表。另外,类B虚继承类A时,首先要通过加入一个虚指针来指向父类A,然后还要包含父类A的所有内容。因此是4(char[3] 对齐)+4(a)+8=16。我个人认为还是取决于实现机制,g++的sizeof就完全不考虑虚函数表所占的内存

2、typedef:用来声明一个别名,typedef后面的语法,是一个声明。

(1)、区分#define

(2)、type (*)(….)函数指针 和type (*)[]数组指针

3、赋值运算符函数

明确几个概念
(1)、浅拷贝、深拷贝
——浅拷贝,只是对指针的拷贝,拷贝后两个指针指向同一个内存空间;
——深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针。
一个典型的例子就是函数传递数组。数组退化为指针传递,实际上就是浅拷贝
void f1(int a[]){ int i=0; int len=6; for(;i<len;i++){ a[i]=i+10; }void main(){  int a[5]={1,2,3,4,5};  f1(a);}
(2)、构造函数、拷贝构造函数、赋值运算符函数

  • 构造函数: a("123")
  • 拷贝构造函数:  String d = a; 等价于 String d(a);
  • 赋值运算符:    c = a;