我们可以使用一个接收一个回调函数的 Promise 构造器创建一个 promise。 好酷,让我们尝试一下! 等等,刚刚得到的返回值是什么?...如果宏任务中还有任务,会从宏任务队列中弹出进入调用栈,被执行后会从调用栈中弹出! 让我们快速地看一个简单的例子: Task1: 立即被添加到调用栈中的函数,比如在我们的代码中立即调用它。...图中足够粉色的盒子是不同的任务,让我们用一些真实的代码来使用它! 在这段代码中,我们有宏任务 setTimeout 和 微任务 promise 的 then 回调。...由于调用栈是空的,它将会去检查在微任务队列中是否有在排队的任务!是的,有任务在排队,promise 的 then 中的回调函数正在等待轮到它!...被打印到控制台并且console.log从调用栈弹出。 最终,所有的事情都完成了!你注意到async函数相比于promise的then有什么不同吗?
一、内联函数 1.1内联函数的定义 以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。...首先,内联函数克服了宏定义不可调试的缺点,内联函数可以通过调试进到函数体的内部观察函数体中代码的逻辑运行。...1.2.3使用方式说明 鉴于内联函数的缺点,因此类中的函数在定义的时候短小的函数(一般不超过十行)可以考虑定义为内联函数,代码量大的函数就不要定义成内联函数了。...从上面的代码可以看到,类实例化出来的对象大小只包含了成员变量的大小,当然也会涉及内存对齐 (内存对齐在前面的博客中已有详细介绍),不包含成员函数的大小。...一般情况下,我们都要自己写构造函数 成员都是自定义类型,或者声明时给了缺省值,可以考虑让编译器自己生成构造函数 8.默认析构函数 默认生成的析构函数,行为跟构造类似 内置类型成员不做处理,自定义类型成员会去调用它的析构函数
经常用到友元的一个地方是将 FooBuilder 声明为 Foo 的友元,以便 FooBuilder 正确构造 Foo 的内部状态,而无需将该状态暴露出来。...值得庆幸的是,C++ 中,宏不像在 C 中那么必不可少。以往用宏展开性能关键的代码,现在可以用内联函数替代。用宏表示常量可被 const 变量代替。用宏 “缩写” 长变量名可被引用代替。...(4)不要试图使用展开后会导致 C++ 构造不稳定的宏,不然也至少要附上文档说明其行为。 (5)不要用 ## 处理函数,类和变量的名字。...p = {1,2}; 从 C++11 开始,该特性得到进一步的推广,任何对象类型都可以被列表初始化。...在复杂的地方使用模板的代码让人更不容易读懂,并且debug 和 维护起来都很麻烦。
幸运的是Promise可以帮助我们解决上述问题,首先我们重构上述代码,让每个函数都返回一个Promise。...该(宏)任务队列是(宏)任务和microtask队列是microtasks。 那么什么是宏任务队列,什么是微任务队列?虽然实际上存在的比我下面列出来的多,但是在下面的表格中都是我们最常见的! ?...他们都是内部方法,实际上不会出现在stack trace中, - 所以不要担心,如果你使用调试器,你在任何地方都看不到他们!它只是辅助我们更容易理解事件循环概念?...Async/Await ES7在JavaScript中引入了一个新的方法来添加异步行为,并且它让promise使用起来更加容易了!...通过await关键字我们可以暂停一个异步函数,我们可以分配一个变量给await resolved状态的promise,就像之前我们使用promise.then方法回调那样,我们就可以得到一个resoled
经常用到友元的一个地方是将 FooBuilder 声明为 Foo 的友元,以便 FooBuilder 正确构造 Foo 的内部状态,而无需将该状态暴露出来。...值得庆幸的是,C++ 中,宏不像在 C 中那么必不可少。以往用宏展开性能关键的代码,现在可以用内联函数替代。用宏表示常量可被 const 变量代替。用宏 “缩写” 长变量名可被引用代替。...(4)不要试图使用展开后会导致 C++ 构造不稳定的宏,不然也至少要附上文档说明其行为。 (5)不要用 ## 处理函数,类和变量的名字。...p = {1,2}; 从C++11开始,该特性得到进一步的推广,任何对象类型都可以被列表初始化。...在复杂的地方使用模板的代码让人更不容易读懂,并且debug 和 维护起来都很麻烦。
,打印出来的结果跟预期一样,由(__STDC__)的结果看,dev C++遵循ANSIC。...2.更为重要的是,函数的参数必须声明为特定的类型。所以函数只能在类型合适的表达式上使用,反之这个宏可以适用于整形长整型浮点型等可以用于>来比较的类型。宏与类型无关。...函数代码只出现于一个地方;每 次使用这个函数时,都调用那个 地方的同一份代码 执 行 速...参 数 类 型 宏的参数与类型无关,只要对参数的操作是合法的, 它就可以使用于任何参数类型。...调 试 宏是不方便调试的 函数是可以逐语句调试的。
(参见 对语言的选择),试图通过检查一个测试程序是否可以和库 library进行连接以获取C、C++或者Fortran 77函数 function,从而确认函数 function 是可以使用的。...本变量是从LIBOBJS中分离出来的,因此在只有一部分程序使用LIBOBJS中的代码时,多个程序就可以不必创建实际的库而共享ALLOCA的值。...有些版本甚至不含有alloca或者含有带bug的版本。如果你仍然需要使用它们的alloca,用ar把`alloca.o'从这些库中提取出来,而不是编译`alloca.c'。...在可能的地方使用它们;如果不能,就发明一个你自己的类别。 C C语言内置特征。 DECL 在头文件中对C变量的声明。 FUNC 库中的函数。...如果给出了 suggestion,就在警告消息的末尾打印它;例如,它可以建议用某个宏来代替 this-macro-name。 手工配置 有几种特征不能通过运行测试程序而自动猜测出来。
使用单线程,我们可以保证只有一个线程处理UI渲染,不会出现经典的多线程的问题。...所以async/await到底是啥 Promise也不是万能的,如果使用不当,在then回调里处理其它请求,也会导致代码里充斥着then函数回调,这又会导致开发者再次陷入回调地狱的恐惧之中。...首先,执行console.log(0)这个语句,打印出来0。...然后V8会暂停当前协程的执行,将主线程的控制权转交给父协程执行,同时会将promise_对象返回给父协程。 接下来继续执行父协程的流程,这里我们执行console.log(3),并打印出来3。...,大家应该有不少是死记了宏任务跟微任务的执行顺序,通过现在底层原理的分析,相比我们已经能很轻松地说出来了。
还缺些什么 缺少宏对我来说使 Java 减分不少(我并不说在 C/C++ 中使用的预处理器宏,而是在Lisp/Scheme 中使用的那种宏)。...比方说,我想把一段经常使用的代码提取出来,然后在需要地方使用——为了达到这个目的,我必须要把这段代码封装成一个final static的方法,并放在一个类中。...这样一来我还得费劲去给类取一个方便理解的名字……本来这事儿可以很简单(这确实很简单, 尤其是当你可以定义宏的时候)。 有没有搞错 缺乏对泛型的支持。C++ 中的模板要强大的多。...事实上,在Java 中你根本不能在泛型中实例化一个类,除非你把这个类作为参数来声明一个泛型。 你很难给一个类加上结构函数并让它销毁这个类。RAII(一种资源管理模式,见 C++)却一直非常有用。...这些是我最先想到的,不过觉得应该还有更多。认真地说,使用回调函数一直是一个大问题,因为它太麻烦了。不过Java 8 中解决了这个问题,我还是很开心的 =) 愚蠢的默认值 默认的可见性。
槽和普通的C++成员函数几乎是一样的,它可以是虚函数,可以被重载,可以是共有、私有或是保护的,也同样可以被其他成员函数调用。它的函数参数也可以是任意类型的。唯一不同的是:槽还可以和信号连接在一起。...与回调不同,信号槽机制是类型安全的。这体现在信号的函数签名与槽的函数签名必须匹配上,才能够发生信号的传递。实际上,槽的参数个数可以比信号的参数个数少,因为槽能够忽略信号形参中多出来的参数。...在这个简单的类中,我们可以看到,使用slots来表示槽,而使用signals来表示信号。...label输出来看看b是否接收到a的信号,如果是,则b的内容应该是"this is A",输出在label上,程序运行结果: 这个例子展示了对象之间通信的一种方式。...同样的,可以让多个信号连接到同一个槽上 ,而且其中的每一个信号的发送,都会调用了那个槽。
因此如果使用非常量的格式化字符串, 需要将宏的值而不是宏名插入格式中. 使用 PRI* 宏同样可以在 % 后包含长度指示符....值得庆幸的是, C++ 中, 宏不像在 C 中那么必不可少. 以往用宏展开性能关键的代码, 现在可以用内联函数替代. 用宏表示常量可被 const 变量代替. 用宏 “缩写” 长变量名可被引用代替....不要只是对已经存在的宏使用#undef,选择一个不会冲突的名称; 不要试图使用展开后会导致 C++ 构造不稳定的宏, 不然也至少要附上文档说明其行为. 不要用 ## 处理函数,类和变量的名字。...在复杂的地方使用模板的代码让人更不容易读懂, 并且debug 和 维护起来都很麻烦 模板编程经常会导致编译出错的信息非常不友好: 在代码出错的时候, 即使这个接口非常的简单, 模板内部复杂的实现细节也会在出错信息显示...大量的使用模板编程接口会让重构工具(Visual Assist X, Refactor for C++等等)更难发挥用途.
有些集成测化的测试工具可以对const常量进行调试,但是不能对宏常量进行调试。 在C++程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量。...在C++程序中,类里面的数据成员加上mutable后,修饰为const的成员变量,就可以修改它了。 2.sizeof与strlen的区别?...3.说明sizeof的使用场景 sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信。 用它可以看看某种类型的对象在内存中所占的单位字节。...内联函数和普通函数相比可以加快程序运行的速度,因此不需要中断调用,在编译的时候内联函数可以直接被镶嵌到目标代码中。而宏只是一个简单的替换。 内联函数制作参数类型检查,这是内联函数跟宏比的优势。...inline是指嵌入代码,就是在调用函数的地方不是跳转而是直接把代码写进去。
Java、Python等等语言在崩溃的时候都会打印一条异常的堆栈信息并告诉用户那块出错了,根据这个信息程序员可以很容易找到对应的代码位置并进行处理,而C/C++则会弹出一个框告诉用户程序崩溃了,二者对比来看...,C++似乎对用户太不友好了,而且根据它的弹框很难找到对应的问题,那么有没有可能使c++像Java那样打印异常的堆栈呢?...打印函数调用堆栈 关于打印堆栈的内容,这里不再多说了,请参考本人之前写的博客 windows平台调用函数堆栈的追踪方法 这里的主要思路是使用StackWalker来根据当前的堆栈环境来获取对应的函数信息...在获取堆栈信息的时候首先判断是否为当前线程,如果不是那么为了结果准确,需要先停止目标线程,然后获取,否则直接使用宏来获取,对应的宏定义如下: #define GET_CURRENT_THREAD_CONTEXT...库的具体使用请参考main.cpp这个文件,相信有这篇博文以及源码各位应该很容易就能够使用它。
槽和普通的C++成员函数几乎是一样的,它可以是虚函数,可以被重载,可以是共有、私有或是保护的,也同样可以被其他成员函数调用。它的函数参数也可以是任意类型的。唯一不同的是:槽还可以和信号连接在一起。...与回调不同,信号槽机制是类型安全的。这体现在信号的函数签名与槽的函数签名必须匹配上,才能够发生信号的传递。实际上,槽的参数个数可以比信号的参数个数少,因为槽能够忽略信号形参中多出来的参数。...所有包含了信号槽的类都必须在声明的上部含有Q_OBJECT宏。...label输出来看看b是否接收到a的信号,如果是,则b的内容应该是"this is A",输出在label上,程序运行结果: 这个例子展示了对象之间通信的一种方式。...同样的,可以让多个信号连接到同一个槽上 ,而且其中的每一个信号的发送,都会调用了那个槽。
1.inline函数简介 inline函数是由inline关键字来定义,引入inline函数的主要原因是用它替代C中复杂易错不易维护的宏函数。...但是使用内联函数的时候,会出现类型不匹配的编译错误。 (3)在类中声明同时定义的成员函数,自动转化为内联函数,因此内联函数可以访问类的成员变量,宏定义则不能。...如果函数库采用的是动态连接,那这一升级的f函数可以不知不觉的被程序使用。 (3)是否内联,程序员不可控。 inline函数只是对编译器的建议,是否对函数内联,决定权在于编译器。...6.小结 可以将内联理解为C++中对于函数专有的宏,对于C的函数宏的一种改进。对于常量宏,C++提供const替代;而对于函数宏,C++提供的方案则是inline。...C++ 通过内联机制,既具备宏代码的效率,又增加了安全性,还可以自由操作类的数据成员,算是一个比较完美的解决方案。
熟悉C语言之后,对C++学习有一定的帮助,本章节主要目标: 补充C语言语法的不足,以及C++是如何对C语言设计不合理的地方进行优化的,比如:作用域方面、IO方面、函数方面、指针方面、宏方面等。...这次就成功的打印出来了rand的值,那打印出来的是个啥大家能看出来吗?...C++输入&输出 新生婴儿会以自己独特的方式向这个崭新的世界打招呼,C++刚出来后,也算是一个新事物。 3.1 输入输出 那C++是否也应该向这个美好的世界来声问候呢?...补充:C++中建议用const和枚举enum代替宏定义的常量 从宏的这些优缺点出发,C++又引入了一个新的概念——内联函数。 7.1 概念 那什么是内联函数呢?...8.2 auto简介 在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,但遗憾的是一直没有人去使用它,大家可以思考下为什么?
所以,我就想要写这么一篇文章,结合自己的理解以及示例代码,用最通俗的文字表达出来。 希望大家可以通过这篇文章,学习到Event loop的运行原理。如果在文中出现有错误的地方,欢迎大家留言一起探讨。...每次我们使用 await, 解释器都创建一个 promise 对象,然后把剩下的 async 函数中的操作放到 then 回调函数中。 async/await 的实现,离不开 Promise。...从字面意思来理解,async 是“异步”的简写,而 await 是 async wait 的简写可以认为是等待异步方法执行完成。...继续执行同步代码,打印Promise和script end,将then函数放入微任务队列中等待执行。 同步执行完成之后,检查微任务队列是否为null,然后按照先入先出规则,依次执行。...然后先执行打印promise1,此时then的回调函数返回undefinde,此时又有then的链式调用,又放入微任务队列中,再次打印promise2。
打印 async1 start;async2 位于 Promise 的执行器中,因此立即执行,遇到了定时器 timer2,把其回调函数分发到宏任务队列,之后打印 async2;Promise 的 then...② 微任务:微任务队列中有 then 的回调函数,进入主栈并执行,打印 async1 end,之后遇到定时器 timer1,其回调函数注册到被分发到宏任务队列。...timer2 的回调函数进入主栈并执行,打印 timer2 ② 微任务:微任务队列中无任务,第二轮事件循环结束 第三轮事件循环: ① 宏任务:宏任务队列中依次有 timer3 和 timer1 这两个定时器的回调函数...timer3 的回调函数进入主栈并执行,打印 timer3 ② 微任务:微任务队列中无任务,第三轮事件循环结束 第四轮事件循环: ① 宏任务:宏任务队列中只有 timer1 这个定时器的回调函数。...promise 前面没有加上 await,所以 for...of 里面的代码就是彻底的同步代码了,在每一次打印 4 之后,promise 也是紧跟着打印出来的,经过前面的分析可以知道,这个时候的 promise
--- 父类指针指向子类对象的时候,释放内存的时候,若父类的析构函数不是virtual的话,子类的内存是不会得到释放的,因此会内存泄漏 c++中是如何处理内存泄漏的: 使用valgrind,mtrace...它可以打印出cache未命中的次数,内存引用和发生cache未命中的每一行 代码,每一个函数,每一个模块和整个程序的摘要。 若要求更细致的信息,它可以打印出每一行机器码的未命中次数。...函数指针的好处和作用: 好处:简化结构和程序通用性的问题,也是实现面向对象编程的一种途径 作用: 实现面向对象编程中的多态性 回调函数 inline函数与宏定义 inline函数是C++引入的机制...为什么要引入内联函数(内联函数的作用) 用它替代宏定义,消除宏定义的缺点。 宏定义使用预处理器实现,做一些简单的字符替换因此不能进行参数有效性的检测。...函数作为类的成员函数,可以使用类的保护成员及私有成员; inline函数使用的场合 使用宏定义的地方都可以使用 inline 函数; 作为类成员接口函数来读写类的私有成员或者保护成员; 为什么不能把所有的函数写成
领取专属 10元无门槛券
手把手带您无忧上云