问题描述如图所示,要求使用c++面向对象的程序设计方法,运用析构函数和构造函数
必须要用类吗?
#include <iostream>
using namespace std;
class CallSame
{
private:
int *p;
int n;
public:
CallSame() {n=0;}
CallSame(int *p,int n)
{
this->n = n;
this->p = new int[n];
for(int i=0;i<n;i++)
this->p[i] = p[i];
}
~CallSame()
{
if(p!=NULL)
{
delete []p;
p = NULL;
}
}
void Call()
{
int count = 0,num = 0;
for(int i=0;i<n-1;i++)
{
count = 1;
if(i!=0 && p[i]==p[0])
continue;
for(int j=i+1;j<n;j++)
{
if(p[i] == p[j])
{
count++;
if(i!=0)
p[j] = p[0];
}
}
if(count == 2)
{
num++;
count = 0;
cout<<p[i]<<" ";
}
}
if(num==0)
cout<<"none";
}
};
int main()
{
int a[20];
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
CallSame cs(a,n);
cs.Call();
system("pause");
return 0;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!进程切换分两步:
1)切换页目录以使用新的地址空间;2)切换内核和硬件上下文。
切换的性能消耗:1)线程上下文切换和进程上下文切换一个最主要的区别是线程的切换虚拟内存空间依然是相同的,但是进程切换是不同的。这两种上下文切换的处理都是通过操作系统内核来完成。内核的这种切换过程伴随的最显著性能损耗是将寄存器中的内容切换出。2)另外一个隐藏的损耗是上下文的切换会扰乱处理器的缓存机制。简单的说,一旦去切换上下文,处理器中所有已经缓存的内存地址一瞬间都作废了,还有一个显著的区别是当你改变虚拟内存空间的时候,处理的页表缓冲,这将导致内存的访问在一段时间内相当的低效。但是在线程的切换中,不会出现这个问题。
为什么虚拟地址切换很慢
现在我们已经知道了进程都有自己的虚拟地址空间,把虚拟地址转换为物理地址需要查找页表,页表查找是一个很慢的过程,因此通常使用Cache来缓存常用的地址映射,这样可以加速页表查找,这个cache就是TLB,Translation Lookaside Buffer,我们不需要关心这个名字只需要知道TLB本质上就是一个cache,是用来加速页表查找的。由于每个进程都有自己的虚拟地址空间,那么显然每个进程都有自己的页表,那么当进程切换后页表也要进行切换,页表切换后TLB就失效了,cache失效导致命中率降低,那么虚拟地址转换为物理地址就会变慢,表现出来的就是程序运行会变慢,而线程切换则不会导致TLB失效,因为线程线程无需切换地址空间,因此我们通常说线程切换要比较进程切换块,原因就在这里。
int recv(socket s,char *buf,int len,int flags);
接收端套接字描述符、缓冲区用来存储recv函数接收到的数据、buf的长度、0
返回值:<0 出错、=0连接关闭、>0接收到数据大小。若没有数据,则recv会一直等。
阻塞模式下recv会一直阻塞直到接收到数据,非阻塞模式下如果没有数据就会返回,不会阻塞着读,因此需要循环读取。
int send(socket s,char* buf,int len,int flags)
返回值:<0 出错、=0 连接关闭、>0表示发送的字节数
ps -aux 查看进程PID
lsof -p 1430:可以获取打开的文件信息,类型、大小、节点信息等
ll proc/1430/fd:查看打开的文件描述符
netstat -nap | grep PID