C++面试总结之linux(二)

1.指针的寻址过程

数组是相同数据类型的数据集合,以线性方式连续存储在内存中,而指针只是保存一个地址值的4字节变量。在使用中,数组名是一个地址常量值,保存数据首元素地址,不可修改,因此只能以基地址访问内存数据。指针是一个变量,可以修改,随意访问内存数据。

数组作为参数和返回值,都是将数组的首地址以指针的方式进行传递,但是它们也有不同。将数组作为参数时,其定义所在的作用域必然在函数调用以外,在调用之前已经存在。而数组作为函数的返回值则有一定的风险。当数组作为局部变量数据时,便出现了稳定性问题。

P.S. 字符类型的数组的赋值(初始化)其实是复制字符串的过程。这里并不是单字节的复制,而是每次复制4字节的数据。

     访问数组的方式有两种:通过下标寻址和通过指针寻址。指针寻址没有下标寻址便利,效率也低。因为指针是存放地址数据的变量类型,因此在数据访问的过程中,要先取出指针变量中的数据,然后再针对数据进行地址偏移计算,从而寻址到目标数据。而数组名本身就是常量地址,可直接对数据名所代替的地址进行偏移计算。

     1. 当下标值为整型常量时,由于类型大小已知,编译器可直接计算出数据所在的地址。其寻址过程与局部变量相同。

     2. 当下标值为整型变量时,编译器无法计算出相应的地址,只能先进行地址偏移计算,然后得出目标数据所在的地址

     3. 当下标值为整型表达式时,先计算出表达式的结果,然后将其结果作为下标值。如果是常量计算,常量会被折叠,最后还是以常量为下标寻址。

2.Linux文件的三个时间(acm)

修改时间(mtime):文件的内容被最后一次修改的时间,我们经常用的ls -l命令显示出来的文件时间就是这个时间,当用vim对文件进行编辑之后保存,它的mtime就会相应的改变;

访问时间(atime):对文件进行一次读操作,它的访问时间就会改变。例如像:cat、more等操作,但是像之前的state还有ls命令对atime是不会有影响的;

状态时间(ctime):当文件的状态被改变的时候,状态时间就会随之改变,例如当使用chmod、chown等改变文件属性的操作是会改变文件的ctime的。

除了可以通过stat来查看文件的mtime,ctime,atime等属性,也可以通过ls命令来查看,具体如下:

ls -lc filename 列出文件的 ctime (最后更改时间)

ls -lu filename 列出文件的 atime(最后存取时间)

ls -l filename 列出文件的 mtime (最后修改时间)

stat -c '%A %a %n' /etc/timezone

3.软连接与硬链接

若一个 inode 号对应多个文件名,则称这些文件为硬链接。换言之,硬链接就是同一个文件使用了多个别名。硬链接可由命令 link 或 ln 创建。由于硬链接是有着相同 inode 号仅文件名不同的文件,因此硬链接存在以下几点特性:

文件有相同的 inode 及 data block;

只能对已存在的文件进行创建;

不能交叉文件系统进行硬链接的创建;

不能对目录进行创建,只可对文件创建;

删除一个硬链接文件并不影响其他有相同 inode 号的文件。

软链接与硬链接不同,若文件用户数据块中存放的内容是另一文件的路径名的指向,则该文件就是软连接。软链接就是一个普通文件,只是数据块内容有点特殊。软链接有着自己的 inode 号以及用户数据块(见 图 2.)。因此软链接的创建与使用没有类似硬链接的诸多限制:

软链接有自己的文件属性及权限等;

可对不存在的文件或目录创建软链接;

软链接可交叉文件系统;

软链接可对文件或目录创建;

创建软链接时,链接计数 i_nlink 不会增加;

删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接。

4.深复制与浅复制

对于C++而言,在程序员进行类定义的时候,系统会自动生成四个函数,即,构造函数、析构函数、拷贝函数和赋值函数。这一点在 String 类的身上有很明显体现。

类对象是通过拷贝函数来实现类对象之间的拷贝的,存在类对象拷贝的三种情况

1. 用已有对象初始化新对象。例: Myclass Obj_A(Obj_B);

2. 调用输入参数为类对象的函数。例:Myclass func_A(Obj_A);

3. 调用返回值为类对象的函数。例:Myclass B = func_B();

此时函数的返回值为类对象,为给新的对象 B 赋值,此时,系统会临时复制出一个对象。

深拷贝的原因:类对象间复制,因类成员存在资源(动态内存,堆)申请的情况,而产生因复制出现的混乱。

例:原有对象 a 的成员存在动态内存申请,将对象 a 复制给对象 b ,b 获得的是 a 开辟的内存空间地址,若类未自定义拷贝(复制)函数,系统自行处理使得该内存空间的隶属权产生混乱。一旦析构,该空间将面临两次内存释放的情况,出现运行错误。

为解决上述问题,C++有了深拷贝于浅拷贝的概念,那么现在来谈谈什么是深拷贝什么是浅拷贝。

深拷贝可以理解为类拥有资源(堆,动态内存或其它系统资源),当类对象发生复制时,申请资源重建的情况称之为深拷贝,申请资源未重建的情况称之为浅拷贝。

浅拷贝其实直接使用系统自行定义的拷贝构造函数即可,深拷贝的实现方式:

自定义拷贝函数,对待“赋值”对象进行动态内存之类的操作机制,输入参数一定是引用。例:Myclass(Myclass &srs);

猜你喜欢

转载自blog.csdn.net/lxin_liu/article/details/89312177