C++-10.09

1、可扩展性:
在一个农场里有农场主和奶牛,农场主每天为奶牛挤奶;现在把农场主和奶牛分别看作对象。根据以上描述,考虑到程序的可扩展性和维护性,请说明把挤奶这个行为分配农场主有怎样的好处?如果分配给奶牛又有怎样的好处?
其中把挤奶这个行为分配给农场主,有利于可扩展性,原因是挤奶是一个人的动作,可以给许多奶牛进行操作,换句话说就是这个行为可以给多个对象服务。而把挤奶的行为分配给奶牛,有利于可维护性,原因是只有还能产奶的奶牛才能给于挤奶的操作,如果一些牛停奶了,那该挤奶的行为就应该不再提供了,换句话说就是相同类的不同对象如果其中之一出现问题或故障,可以仅仅从该对象而不是整个类进行修改或维护。
2、Struct中字节对齐?修改默认对齐方式
结构体每个成员相对于结构体首地址的偏移量都是该成员大小的整数倍,如有需要,编译器会在成员之间加上填充字节;
对于结构体,编译器会自动进行成员变量的对齐,以提高运算效率。
1.在VC IDE中,可以这样修改:[Project]|[Settings],c/c++选项卡Category的Code Generation选项的Struct Member Alignment中修改,默认是8字节。

2.在编码时,可以这样动态修改:#pragma pack .注意:是pragma而不是progma.
3、new和malloc区别
new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。
首先free对应的是malloc;delete对应的是new;free用来释放malloc出来动态内存,delete用来释放new出来的动态内存空间。
在使用malloc和free来处理动态内存的时候,仅仅是释放了这个对象所占的内存,而不会调用这个对象的析构函数;使用new和delete就可以既释放对象的内存的同时,调用这个对象的析构函数,即释放内存的意思。
由于free和malloc配对使用,malloc的时候,大小已经告诉系统了。
free的时候,系统会比对一下这个地址,是不是malloc申请的,如果不是,不给释放
如果是的话,系统就知道要释放多大内存,因为malloc的时候,系统有记录的。
4、shared_ptr和unique_ptr区别
(1)shared_ptr 允许多个指针指向同一个对象
(2)unique_ptr 独占所指向的对象
5、strcpy
1、目标参数的以前内容将被覆盖并丢失。即使新的字符串比dst原先的内存更短,由于新的字符串是以NUL字节结尾,所以老字符最后剩余的几个字符也会被有效的删除
char message[ ] = “Original message”;
strcpy(message,:“Different”);
第一个字节后面的几个字符再也无法被字符串函数访问,因此从任何现实的角度看,它们都已经是丢失的了。
如果字符串比数组长,多余的字符串扔被复制,它们将覆盖原来存储于数组后面的内存空间的值。strcpy无法解决这个问题,因为它无法判断目标字符数组的长度。
6、进程通信,线程通信
进程:管道,FIFO有名管道,消息队列,信号量,共享内存
无名管道和有名管道之间的区别在于有名管道提供了一个路径名与之关联,一FIFO的文件形式存在于文件系统中,而无名管道只能通过fork进行父子亲缘关系之间的进程进行通信。
1.管道:速度慢,容量有限,只有父子进程能通讯
2.FIFO:任何进程间都能通讯,但速度慢
3.消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题
4.信号量:不能传递复杂消息,只能用来同步
5.共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存
6 套接字socket
线程:
传统线程通信synchronized + wait + notify
Object类的wait()、notify() 、notifyAll()三个方法必须由同步监视器对象来调用,分两种情况:
互斥所,读写锁,条件变量,信号量,
7、
互斥所,条件所,自旋锁,读写锁,递归锁
互斥锁用于控制多个线程对他们之间共享资源互斥访问的一个信号量。也就是说是为了避免多个线程在某一时刻同时操作一个共享资源。例如线程池中的有多个空闲线程和一个任务队列。任何是一个线程都要使用互斥锁互斥访问任务队列,以避免多个线程同时访问任务队列以发生错乱。
条件锁就是所谓的条件变量,某一个线程因为某个条件为满足时可以使用条件变量使改程序处于阻塞状态。一旦条件满足以“信号量”的方式唤醒一个因为该条件而被阻塞的线程。最为常见就是在线程池中,起初没有任务时任务队列为空,此时线程池中的线程因为“任务队列为空”这个条件处于阻塞状态。一旦有任务进来,就会以信号量的方式唤醒一个线程来处理这个任务。这个过程中就使用到了条件变量pthread_cond_t
自旋锁就不同了,自旋锁是一种busy-waiting的锁。也就是说,如果T1正在使用自旋锁,而T2也去申请这个自旋锁,此时T2肯定得不到这个自旋锁。与互斥锁相反的是,此时运行T2的处理器core2会一直不断地循环检查锁是否可用(自旋锁请求),直到获取到这个自旋锁为止。
从“自旋锁”的名字也可以看出来,如果一个线程想要获取一个被使用的自旋锁,那么它会一致占用CPU请求这个自旋锁使得CPU不能去做其他的事情,直到获取这个锁为止,这就是“自旋”的含义。
说到读写锁我们可以借助于“读者-写者”问题进行理解。首先我们简单说下“读者-写者”问题。计算机中某些数据被多个进程共享,对数据库的操作有两种:一种是读操作,就是从数据库中读取数据不会修改数据库中内容;另一种就是写操作,写操作会修改数据库中存放的数据。因此可以得到我们允许在数据库上同时执行多个“读”操作,但是某一时刻只能在数据库上有一个“写”操作来更新数据。这就是一个简单的读者-写者模型。
8、挥手
确保数据能够完整传输。
这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值