内联函数

Go语言进阶学习笔记

╄→гoц情女王★ 提交于 2020-04-07 00:46:54
协程 创建时默认的 stack 的⼤⼩ JDK5 以后 Java Thread stack 默认为1M Groutine 的 Stack 初始化⼤⼩为2K 和 KSE (Kernel Space Entity 系统线程) 的对应关系 Java Thread 是 1:1 Groutine 是 M:N Thread 切换代价大 先说,协程的本质是用户态的线程,用户对其有控制权限,内存占用少,切换代价低。 再来解释一下MPG是什么意思。 M代表内核线程,所有的G都要放在M上才能运行。 P代表控制器,调度G到M上,其维护了一个队列,存储了所有需要它来调度的G。 G代表一个go routine单元。 补充几点常见的调度策略: 1,如果某个M陷入阻塞呢? 当一个OS线程M由于io操作而陷入阻塞,假设此时G0正跑在了M上,那么M上绑定的P就会带着余下的所有G去寻找新的M。当M恢复过来时,一般情况下,会从别的M上拿过来一个P,并把原先跑在其上的G0放到P的队列中,从而运行G0。如果,没有拿到可用的P的话,就把G0放入到全局global runqueue队列中,使G0等待被调度,然后M进入线程缓存。所有的P也会周期性的检查global runqueue并运行其中的goroutine,否则global runqueue上的goroutine永远无法执行。 2,如果有的M较忙,有的M较闲呢?

C++中的头文件和源文件

China☆狼群 提交于 2020-04-06 19:28:31
一、C++编译模式 通常,在一个C++程序中,只包含两类文件——cpp文件和h文件。cpp文件被称作C++源文件,里面放的都是C++的源代码;h文件则被称作C++头文件,里面放的也是C++的源代码。 C+ +语言支持“分别编译”(separate compilation)。也就是说,一个程序所有的内容,可以分成不同的部分分别放在不同的.cpp文件里。 cpp文件里的东西都是相对独立的,在编译(compile)时不需要与其他文件互通,只需要在编译成目标文件后再与其他的目标文件做一次链接(link)就行了。比如,在文件a.cpp中定义了一个全局函数“void a() {}”,而在文件b.cpp中需要调用这个函数。即使这样,文件a.cpp和文件b.cpp并不需要相互知道对方的存在,而是可以分别地对它们进行编译, 编译成目标文件之后再链接,整个程序就可以运行了。 二、C++头文件 头文件的内容跟.cpp文件中的内容一样,都是C++源代码。但头文件不用被编译。 我们把所有的函数声明全部放进一个头文件中,当某一个cpp源文件需要它们时,它们就可以通过一个宏命令“#include”包含进这个cpp文件中,从而把它们的内容合并到cpp文件中去。当cpp文件被编译时,这些被包含进去的h文件的作用便发挥了。 #include的作用是把它后面所写的那个文件的内容,完完整整地

宏,内联函数和普通函数的区别

好久不见. 提交于 2020-04-04 07:56:29
内联函数的执行过程与带参数宏定义很相似,但参数的处理不同。带参数的宏定义并不对参数进行运算,而是直接替换;内联函数首先是函数,这就意味着函数的很多性质都适用于内联函数,即内联函数先把参数表达式进行运算求值,然后把表达式的值传递给形式参数。 内联函数与带参数宏定义的另一个区别是,内联函数的参数类型和返回值类型在声明中都有明确的指定;而带参数宏定义的参数没有类型的概念,只有在宏展开以后,才由编译器检查语法,这就存在很多的安全隐患。 使用内联函数时,应注意以下问题: 1)内联函数的定义性声明应该出现在对该函数的第一次调用之前。 2)内联函数首先是函数,函数的很多性质都适用于内联函数,如内联函数可以重载。 3)在内联函数中不允许使用循环语句和switch结果,带有异常接口声明的函数也不能声明为内联函数。 先说宏和函数的区别: 1. 宏做的是简单的字符串替换(注意是字符串的替换,不是其他类型参数的替换),而函数的参数的传递,参数是有数据类型的,可以是各种各样的类型. 2. 宏的参数替换是不经计算而直接处理的,而函数调用是将实参的值传递给形参,既然说是值,自然是计算得来的. 3. 宏在编译之前进行,即先用宏体替换宏名,然后再编译的,而函数显然是编译之后,在执行时,才调用的.因此,宏占用的是编译的时间,而函数占用的是执行时的时间. 4. 宏的参数是不占内存空间的,因为只是做字符串的替换

内联函数

ε祈祈猫儿з 提交于 2020-03-24 06:41:53
引入内联函数的目的是为了解决程序中函数调用的效率问题。 函数是一种更高级的抽象。它的引入使得编程者只关心函数的功能和使用方法,而不必关心函数功能的具体实现;函数的引入可以减少程序的目标代码,实现程序代码和数据的共享。但是,函数调用也会带来降低效率的问题,因为调用函数实际上将程序执行顺序转移到函数所存放在内存中某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方。这种转移操作要求在转去前要保护现场并记忆执行的地址,转回后先要恢复现场,并按原来保存地址继续执行。因此,函数调用要有一定的时间和空间方面的开销,于是将影响其效率。特别是对于一些函数体代码不是很大,但又频繁地被调用的函数来讲,解决其效率问题更为重要。引入内联函数实际上就是为了解决这一问题。 在程序编译时,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体来进行替换。显然,这种做法不会产生转去转回的问题,但是由于在编译时将函数休中的代码被替代到程序中,因此会增加目标程序代码量,进而增加空间开销,而在时间代销上不象函数调用时那么大,可见它是以目标代码的增加为代价来换取时间的节省。 内联函数的定义方法 定义内联函数的方法很简单,只要在函数定义的头前加上关键字inline即可。内联函数的定义方法与一般函数一样。如: inline int add_int (int x, int y, int z) { return

C++ | inline关键字和内联函数

半城伤御伤魂 提交于 2020-03-17 05:00:18
inline关键字 作用:避免频繁调用函数对栈内存重复开辟所带来的消耗。 在 c/c++ 中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了 inline 修饰符,表示为内联函数。 栈空间就是指放置程序的局部数据(也就是函数内数据)的内存空间。 在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足而导致程序出错的问题,如,函数的死循环递归调用的最终结果就是导致栈内存空间枯竭。 内联函数 C++内联函数是通常与类一起使用。如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方。 对内联函数进行任何修改,都需要重新编译函数的所有客户端,因为编译器需要重新更换一次所有的代码,否则将会继续使用旧的函数。 如果想把一个函数定义为内联函数,则需要在函数名前面放置关键字 inline,在调用函数之前需要对函数进行定义。 要点(Tips) 在内联函数内不允许使用循环语句和开关语句,并且不能内联函数本身不能是直接递归函数; 内联函数的定义必须出现在内联函数第一次调用之前; 类结构中所在的类说明内部定义的函数是内联函数。 inline仅是一个对编译器的建议; 建议 inline 函数的定义放在头文件中; 关键字 inline 必须与函数定义体放在一起才能使函数成为内联,仅将 inline 放在函数声明前面不起任何作用;

内联函数规则

不打扰是莪最后的温柔 提交于 2020-03-09 12:21:47
1、内联函数的声明必须在调用之前。 #include<iostream> inline bool ischar(char); //内联声明 int main(){ char c; if(ischar(c)){....} } bool ischar(char ch){....} 如果是下面这种情况,那么在程序编译的过程中,并不认为那是内联函数,会将他当做普通函数对待。 #include<iostream> bool ischar(char); //此处无inline int main(){ char c; if(ischar(c)){....} } inline bool ischar(char ch){....} //此处为inline 所以在编译时,在调用之前看到内联声明就十分必要了。 2、内联函数应该尽可能的小,并且要结构简单,这样嵌入代码时才不会影响调用函数的主体结构。因此,内联函数不能出现switch、while等语句,如果出现这些语句,那么编译时将会无视这个内联函数,将它作为普通函数对待。 3、递归函数也不能作为内联函数 来源: https://www.cnblogs.com/peixu/p/12447358.html

C++面试题

时光怂恿深爱的人放手 提交于 2020-03-08 08:06:32
语言基础类 1. 指针和引用的区别? (1)指针有自己的一块空间,而引用只是一个别名;  (2)使用 sizeof 看一个指针的大小为 4 字节(32位,如果要是64位的话指针为8字节),而引用则是被引用对象的大小。 (3) 引用必须在定义时被初始化,指针不必; (4)不存在指向空值的引用,但存在指向空值的指针。 2.static和 const的用法,(能说出越多越好)(重点) 首先说说const的用法(绝对不能说是常数) 1.限定变量为不可修改。 2.限定成员函数不可以修改任何数据成员。 3.使用const关键字修饰的变量,一定要对变量进行初始化 下面的声明都是什么意思? const int a; a是一个常整型数 int const a; a是一个常整型数 const int *a; a是一个指向常整型数的指针,整型数是不可修改的,但指针可以 int * const a; a为指向整型数的常指针,指针指向的整型数可以修改,但指针是不可修改的 int const * a const; a是一个指向常整型数的常指针,指针指向的整型数是不可修改的,同时指针也是不可修改的 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。

C与C++的区别

二次信任 提交于 2020-02-27 15:35:27
C和C++的区别  参考:C Primer plus 6th  在很大程度上,C++是C的超集,这意味着一个有效的C程序也是一个有效的C++程序。C和C++的主要区别是,C++支持许多附加特性。但是,C++中许多规则与C稍有不同。这些不同使得C程序作为C++程序编译时可能以不同的方式运行或者根本不能运行。  C99标准的发布使得问题更加复杂,因为有些情况使得C更接近C++。例如,C99标准允许在代码中的任意处进行声明,而且可以识别//注释指示符。在其他方面,C99使得其与C++的差异变大。例如,新增了变长数组和关键字restrict。C11缩小了与C++的差异。例如,引进了char16_t类型,新增了关键字_Alignas,新增了alignas宏与C++的关键字匹配。C11仍处于起步阶段,许多编译器开发商甚至都没有完全支持C99。要了解它们之间的区别,需要了解C90,C99,C11之间的区别,还要了解C++11与这些标准之间的区别,以及每个标准与C标准之间的区别。下面主要讨论C99,C11和C++之间的区别。由于C++也在发展,因此,C与C++之间的异同也在不断发展变化。 一. 函数原型  在C++中,函数原型是必不可少的,但是在C中是可选的。  C++允许用户声明多个同名函数,只要参数列表不同即可,这是C++的重载特性。但是在C中这是不可以的。 二. Char常量

C++(7-8章)笔记

 ̄綄美尐妖づ 提交于 2020-02-21 02:55:18
第七章 函数——C++的编程模块 7.1函数 1,函数如何返回值的? 答:函数通过将返回值复制到指定的cpu寄存器或内存单元中来将其返回。随后,调用程序将查看该内存单元。返回函数和调用函数必须就该内存单元中存储的数据的类型达成一致。函数原型将返回值类型告知调用程序,而函数定义命令被调用函数应返回什么类型的数据。 2,为什么需要原型? 答:原型描述了函数到编译器的接口,也就是说,它将函数返回值的类型(如果有的话)以及参数的类型和数量告诉编译器。 3,如果该函数不能修改形参中的数组该如何操作〉    答:可以如下:void show_array(cons tint arr[],int n); 在加上const之后表示该数组无法再sho_array()被修改,但并不是表示该数组中的所有数都是常量。 C++将const int arr[]解释为const int *arr。因此该声明实际上是说,arr指向的是一个常量值。 第八章 函数探幽 8.1 C++内联函数 1,常规函数和内联函数之间的主要区别不在于编写方式,而是在于C++编译器如何将他们组合到程序中。 2,函数执行时内部的操作方式: 编译器执行到函数调用的指令时,程序将在函数调用后立即存储该指令的内存地址,并将函数参数复制到堆栈(为此保留的内存块),跳到标记函数起点的内存单元,执行函数代码(也许还需将返回值放入到寄存器中)

C++与C的主要差异

北城余情 提交于 2020-02-19 16:02:38
文章目录 符号常量 标准输入输出流 内联函数 带默认形参值的函数 函数重载 符号常量 符号常量,也称const常量,是用来表示一个常量的标识符。定义const常量的语法 格式为: const <类型> <常量名>=<表达式>;例如: • const double PI=3.1415926; • 提示: 在程序中使用符号常量可以提高程序的可读性和可维护性。例如将数值计算 中经常使用的一些参数定义为符号常量,当需要改变参数数值时,只需要更改符号 常量的定义语句就行了。 • 在编程时,符号常量同变量一样,都必须“先定义,后使用”。 例如: # include <iostream> using namespace std ; const double PI = 3.14 ; // 可根据需要随时调整PI的精度 int main ( ) { double r ; //定义表示圆的半径的变量 cout << "请输入圆的半径:" ; cin >> r ; //输入圆的半径 cout << "圆的周长是:" << 2 * PI * r << endl ; cout << "圆的面积是:" << PI * r * r << endl ; return 0 ; } 标准输入输出流 在C语言中,输入输出通过调用scanf()和printf()来实现,而C++中则是使用类 对象cin和cout来实现。