Qt相关知识
Qt相关知识
信号与槽
Qt信号与槽机制可以看作是一种观察者模式(Observer Pattern)的设计模型。观察者模式中,有一个被观察的对象(Subject),它可以发出事件或状态改变,并通知所有依赖它的观察者(Observer)。Qt中的信号可以看作是 Subject 发出的事件,而槽可以看作是 Observer 对事件作出的响应。通过信号和槽机制,Qt 实现了一种松耦合、灵活性高的对象间通信方法,能够在许多场景下简化代码逻辑,提高程序的可维护性和可扩展性。
信号与槽的实现需要借助元对象编译器MOC(Meta Object Compiler),这个工具被集成在了 Qt 的编译工具链 qmake中,在开始编译 Qt工程时,会先去执行 MOC。要使用信号 - 槽功能,先决条件是继承 QObject类,并在类声明中增加 Q_OBJECT宏。之后在signals字段之后声明一些函数,这些函数就是信号。在public slots之后声明的函数,就是槽函数。
static QMetaObject::Connection connect( const QObject *sende ...
MYSQL语句执行顺序
MySql Review
SQL语句执行顺序
1. FROM
对 FROM 子句中的左表 <left_table> 和右表 <right_table> 执行笛卡儿积,产生虚拟表 VT1;
2. ON
对虚拟表 VT1 进行 ON 筛选,只有那些符合 <join_condition> 的行才被插入,产生虚拟表 VT2;
3. JOIN
如果指定了 OUTER JOIN(如 LEFT OUTER JOIN、RIGHT OUTER JOIN),那么保留表中未匹配的行作为外部行添加到虚拟表 VT2,产生虚拟表 VT3。如果 FROM 子句包含两个以上的表,则对上一个连接生成的结果表 VT3 和下一个表重复执行步骤 1~ 步骤 3,直到处理完所有的表;
4. WHERE
对虚拟表 VT3 应用 WHERE 过滤条件,只有符合 <where_condition> 的记录才会被插入到 VT4;
5. GROUP BY
根据 GROUP BY 子句中的列,对 VT4 中的记录进行分组操作,产生 VT5;
6. CUBE | ROl ...
现代C++内存模型
现代C++内存模型
CPU有很多优化技术如流水线(Pipeline),动态分支预测(Dynamic Branch Prediction),推断执行(Speculative Execution),寄存器重命名(Register Renaming),各种深奥看不懂的东西,都会使指令的乱序执行。
为了解决底层这个混乱的世界,硬件处理器会提供一些内存屏障(memory barrier)指令,简单地理解就是在指令之间插入一道栅栏,栅栏前后的指令不会跨过栅栏去执行,同时也会确保存储操作同步到其他核。当然如果再细化的话可以分成读内存屏障和写内存屏障,但这些太底层了,如果上层的服务器程序要天天面对这些可能会疯掉。
幸运的是一些高级语言或编译器会定义一套统一的内存模型,比如C++11的原子操作可以指定下面的内存顺序:
memory_order_seq_cst 默认的顺序,该原子操作前后的读写不能跨过该操作乱序;该原子操作之前的写操作都能被所有线程观察到,比如这个例子,如果指定为这个模式(C++里不指定就是这个模式):
-Thread 1- ...
C++可执行程序内存结构
C++ Review
1. 典型C/C++程序内存表示
一个典型的C/C++内存表示分为如下几个部分:
代码段
初始化数据段
未初始化数据段
堆
栈
具体分布如图所示:
代码段
代码段或文本段是简单的文本,它是对象文件或内存程序中的一段,包含了可执行的指令,作为内存区域,代码段被放置在堆或栈的下面,以防堆栈溢出覆盖它。通常代码段是可分享的,因此当程序文件被频繁执行时只有一份代码段会被拷贝进内存,如文本编辑器、C编译器,shell程序等等。另外代码段是只读的,为了防止一个程序不小型修改了其中的指令。
文本段
字面常量
已初始化数据段(数据段)
已初始化数据段又称数据段,它是程序虚拟地址空间的一部分,其中包含已经由程序员初始化的全局变量以及静态变量。需要注意的是,数据段不是只读的,因为变量的值可以在运行时更改,例如:
char s[] = "hello world"; //全局变量int debug = 1;
上述两个已经初始化的全局变量都会被放在数据段,而如:
const char* string = “hello ...
C++问与答(2)
Cpp Question & Answer(2)
1. C++ 中在代码中的 extern "C" 是什么意思?
Question:
C++ 中在代码中的 extern "C" 是什么意思?
比如,
extern "C" { void foo();}
Answer:
C++ 支持函数的重载,重载这个特性给我们带来了很大的便利。为了支持函数重载的这个特性,C++ 编译器实际上将下面这些重载函数
void print(int i);void print(char c);void print(float f);void print(char* s);
编译为
_print_int_print_char_print_float_pirnt_string
这样的函数名,来唯一标识每个函数(不同的编译器实现可能不一样,但都是利用这种机制)。所以当调用 print(3) 时,链接会去查找 _print_int(3) 这样的函数。
C++ 中的变量,编译也类似,如全局变量可能编译 g_xx,类变量编译为 c_xx 等,链接也是 ...
C++问与答(1)
Cpp Question & Answer One
1. 为什么处理一段已排序的数组比处理一段未排序的数组快
Question:
#include <algorithm>#include <ctime>#include <iostream>int main(){ // Generate data const unsigned arraySize = 32768; int data[arraySize]; for (unsigned c = 0; c < arraySize; ++c) data[c] = std::rand() % 256; // !!! With this, the next loop runs faster std::sort(data, data + arraySize); // Test clock_t start = clock(); long long sum = 0; for (unsigned i = 0; i &l ...
C++智能指针
C++智能指针
Introduction
C++ 程序设计中使用堆内存是非常常用的操作,堆内存的申请和释放都由程序员自己管理。但使用普通指针,容易造成内存泄露(忘记释放)、二次释放、程序发生异常时内存泄露等问题等。所以 C++11 就引入了智能指针。
C++ 中的构造函数和析构函数十分强大,可以使用构造和析构解决上面的内存泄漏问题。就算发生了异常,也能够保证析构函数成功执行。但是在多个引用和多线程的时候还是会出现问题。
C++11 中引入了智能指针(Smart Pointer),它利用了一种叫做 RAII(资源获取即初始化)的技术将普通的指针封装为一个栈对象。当栈对象的生存周期结束后,会在析构函数中释放掉申请的内存,从而防止内存泄漏。这使得智能指针实质是一个对象,行为表现的却像一个指针。
Tip: What is meant by Resource Acquisition is Initialization (RAII)?
Answer:
It's a really terrible name for an incredibly powerful concept, a ...
Dual Graph Convolutional Network for Semantic Segmentation
Dual Graph Convolutional Network for Semantic Segmentation
Title: 《Dual Graph Convolutional Network for Semantic Segmentation》
Author: Li Zhang, Xiangtai Li, Anurag Arnab, Kuiyuan Yang, Yunhai Tong, Philip H.S. Torr
DOI:https://doi.org/10.48550/arXiv.1909.06121
URI:https://arxiv.org/abs/1909.06121
Abstract
与之前工作使用的大尺度特征融合或者空洞卷积不同的是,本文提出了一种新颖的GCN解决此类问题(像素级别预测)。Dual Graph Convolutional Network (DGCNet)对输入特征的全局上下文信息进行建模,这是通过在一个框架中对两个正交的图进行建模来完成的。
第一个组件用于对图像中的每个像素的空间关系进行建模,第二个组件对网络特征图的通道维 ...
Ontology learning: Grand tour and challenges
Ontology learning: Grand tour and challenges
Title: 《Ontology learning:Grand tour and challenges》
Author: Ahlem Chérifa Khadira, Hassina Aliane,Ahmed Guessoum
DOI: https://doi.org/10.1016/j.cosrev.2020.100339
URI: https://www.sciencedirect.com/science/article/pii/S1574013720304391?via%3Dihub
Introduction
本体的构建是耗时耗力的,因此自动或半自动构建本体的一些方法被提出,这些方法构成了本体学习(Ontology Learning , OL)的领域。
Ontology definition
本体是一种形式化的、某一共享概念化的显式说明。
概念化指的是由世界上某种现象的抽象模型产生的与这些现象有明确关联的概念。
显式指的这些使用的概念以及约束是显式定义的 ...
如何理解注意力机制与Transformer结构
Attention and Transformer
Attention
Seq2Seq模型
最初的用于机器翻译的Seq2Seq模型是由Encoder RNN和Decoder RNN组成的:
上图中,Encoder RNN的输入为源语言单词序列,为每次根据输入更新的隐藏状态向量,之后Encoder部分的最后一个隐藏状态作为Decoder的初始隐藏状态,包含了输入句子的所有信息,通过它Decoder就知道了这句英语,然后Decoder模型与文本生成器的方式一步步的生成目标语言的单词。
从上述描述中可知Seq2Seq模型通过最后一个状态来记忆整个源语言句子的信息,这就导致该模型难以处理长的句子,Encoder的最后一个状态可能会漏掉一些信息,假如源语言句子中的某些单词被忘记了,Decoder就无从得知完整的句子,也就不可能产生正确的翻译。
从上诉图片中也可以证明我们之前的推测,在Seq2Seq模型结合Attention机制后这种情况就可以得到大大的缓解。
注:BLEU是衡量翻译的准确率,它有许多变体如BLEU-1用于衡量单词翻译的准确率,更高阶的BLEU可以衡量句子 ...