2022.8.22面试

1.Epoll和IOCP的区别
1)Epoll 是Linux系统下的模型;IOCP 是Windows下模型;
2)Epoll 是当事件资源满足时发出可处理通知消息;IOCP 则是当事件完成时发出完成通知消息;
3)从应用程序的角度来看, Epoll 是同步非阻塞的;IOCP是异步操作;

2.QT中文件流和数据流区别的
文件流 (QTextStream)。操作轻量级数据(int,double,QString)数据写入文本件中以后以文本的方式呈现。
数据流 (QDataStream)。通过数据流可以操作各种数据类型,包括对象,存储到文件中数据为二进制。
文件流,数据流都可以操作磁盘文件,也可以操作内存数据。通过流对象可以将对象打包到内存,进行数据的传输。
可以参考如下:https://blog.csdn.net/m0_46201544/article/details/124900024

3.vector的扩容大小
msvc编译器每次是以1.5倍且向下取整的策略进行扩容,gcc编译器则是每次以2.0倍的策略进行扩容。

4.QT信号槽的原理及优势

QT的信号槽的底层实现原理参考:
1.https://blog.csdn.net/qq_36939187/article/details/120362334
2.https://www.jianshu.com/p/4245a56a5728

https://www.cnblogs.com/swarmbees/p/10816139.html 这个博文讲解的比较详细

信号和槽执行流程:

  1. moc预编译帮助我们构建了信号槽回调的开头(信号函数体)和结尾(qt_static_metacall回调函数),中间的回调过程Qt已经在QOjbect函数中实现
  2. signals和slots就是为了方便moc解析我们的C++文件,从中解析出信号和槽
  3. 信号槽总共有5种连接方式,前四种是互斥的,可以表示为异步和同步。第五种唯一连接时配合前4种方式使用的
  4. 信号和槽本质上是一样的,但是对于使用者来说,信号只需要声明,moc帮你实现,槽函数声明和实现都需要自己写
  5. connect方法就是把发送者、信号、接受者和槽存储起来,供后续执行信号时查找
  6. 信号触发就是一系列函数回调

emit调用的函数:

void VbaseDETQwidget::signMouseClicked()
{
QMetaObject::activate(this, &staticMetaObject, 0, nullptr);
}

QMetaCallEvent函数
void QMetaCallEvent::placeMetaCall(QObject *object)
{
if (slotObj_) {
slotObj_->call(object, args_);
} else if (callFunction_ && method_offset_ <= object->metaObject()->methodOffset()) {
callFunction_(object, QMetaObject::InvokeMetaMethod, method_relative_, args_);
} else {
QMetaObject::metacall(object, QMetaObject::InvokeMetaMethod, method_offset_ + method_relative_, args_);
}
}

自己总结相应的实现原理:
1)讲解元对象的生成
2)讲解connect的过程干了些什么,存储了发送者、信号、接受者和槽存储起来,供后续执行信号时查找
3)Q_OBJECT编译后生成的函数
4)信号触发后,调用了signMouseClicked函数中的元函数activate,从connect链接存储中查找信号对应连接的槽函数。如果是直连直接走回到函数obj->call,异步的话走的QMeta函数Object::metacall。

在这里插入图片描述

QT的优点和缺点:
优点
①类型安全。需要关联的信号槽的签名必须是等同的。即信号的参数类型和参数个数同接受该信号的槽的参数类型和参数个数相同。若信号和槽签名不一致,编译器会报错。
②松散耦合。信号和槽机制减弱了Qt对象的耦合度。激发信号的Qt对象无需知道是那个对象的那个信号槽接收它发出的信号,它只需在适当的时间发送适当的信号即可,而不需要关心是否被接受和那个对象接受了。Qt就保证了适当的槽得到了调用,即使关联的对象在运行时被删除。程序也不会奔溃。
③灵活性。一个信号可以关联多个槽,或多个信号关联同一个槽。

不足
速度较慢。与回调函数相比,信号和槽机制运行速度比直接调用非虚函数慢10倍。
原因:
①需要定位接收信号的对象。
②安全地遍历所有关联槽。
③编组、解组传递参数。
④多线程的时候,信号需要排队等待。(然而,与创建对象的new操作及删除对象的delete操作相比,信号和槽的运行代价只是他们很少的一部分。信号和槽机制导致的这点性能损耗,对实时应用程序是可以忽略的。)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值