inline

内联函数和宏

跟風遠走 提交于 2019-12-26 06:14:20
1. 内联函数和宏: 内联扩展是用来消除函数调用时的时间开销。它通常用于频繁执行的函数。一个小内存空间的函数非常受益。那么内联函数和宏之间有什么关系呢?? 实际上,内联函数的功能和预处理宏的功能相似。我们会经常定义一些宏,如 #define TABLE_COMP(x) ((x)>0?(x):0)这就定义了一个宏。看看为什么要使用宏?因为函数的调用必须要将程序执行的顺序转移到函数所存放在内存中的某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方。这种转移操作要求在转去执行前要保存现场并记忆执行的地址,转回后要恢复现场,并按原来保存地址继续执行。因此,函数调用要有一定的时间和空间方面的开销,于是将影响其效率。而宏只是在预处理的地方把代码展开,不需要额外的空间和时间方面的开销,所以调用一个宏比调用一个函数更有效率。这些和内联函数的优点是一样的哦!   但是宏也有很多的不尽人意的地方。   1.宏不能访问对象的私有成员。   2.宏的定义很容易产生二意性。 举个例子: #define TABLE_MULTI(x) (x*x)   我们用一个数字去调用它,TABLE_MULTI(10),这样看上去没有什么错误,结果返回100,是正确的,但是如果我们用TABLE_MULTI(10+10)去调用的话,我们期望的结果是400,而宏的调用结果是(10+10*10+10),结果是120

内联函数与宏--小结

百般思念 提交于 2019-12-26 06:13:57
第一部分:宏 为什么要使用宏呢? 因为函数的调用必须要将程序执行的顺序转移到函数所存放在内存中的某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方。这种转移操作要求在转去执行前要保存现场并记忆执行的地址,转回后要恢复现场,并按原来保存地址继续执行。因此, 函数调用要有一定的时间和空间方面的开销,于是将影响其效率。 而 宏只是在预处理的地方把代码展开,不需要额外的空间和时间方面的开销,所以调用一个宏比调用一个函数更有效率 。 但是宏也有很多的不尽人意的地方。 1、宏不能访问对象的私有成员。 2、宏的定义很容易产生二意性。  我们举个例子:    #define TABLE_MULTI(x) (x*x)   我们用一个数字去调用它,TABLE_MULTI(10),这样看上去没有什么错误,   结果返回100,是正确的,但是如果我们用TABLE_MULTI(10+10)去调用的话,   我们期望的结果是400,而宏的调用结果是(10+10*10+10),结果是120,这显   然不是我们要得到的结果。避免这些错误的方法,一是给宏的参数都加上括号。   #define TABLE_MULTI(x) ((x)*(x))   这样可以确保不会出错,但是,即使使用了这种定义,这个宏依然有可能   出错,例如使用TABLE_MULTI(a++)调用它,他们本意是希望得到(a+1)*

宏与内联函数

笑着哭i 提交于 2019-12-26 06:13:35
第一部分:宏 为什么要使用宏呢? 因为函数的调用必须要将程序执行的顺序转移到函数所存放在内存中的某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方。这种转移操作要求在转去执行前要保存现场并记忆执行的地址,转回后要恢复现场,并按原来保存地址继续执行。因此,函数调用要有一定的时间和空间方面的开销,于是将影响其效率。 而宏只是在预处理的地方把代码展开,不需要额外的空间和时间方面的开销,所以调用一个宏比调用一个函数更有效率。 但是宏也有很多的不尽人意的地方。 1、宏不能访问对象的私有成员。 2、宏的定义很容易产生二意性。 我们举个例子: #define square(x) (x*x) 我们用一个数字去调用它,square(5),这样看上去没有什么错误,结果返回25,是正确的,但是如果我们用squre (5+5)去调用的话,我们期望的结果是100,而宏的调用结果是(5+5*5+5),结果是35,这显然不是我们要得到的结果。避免这些错误的方法,一是给宏的参数都加上括号。 #define square(x) ((x)*(x)) 第二部分:内联函数 从上面的阐述,可以看到宏有一些难以避免的问题,怎么解决呢? 内联函数是代码被插入到调用者代码处的函数。如同 #define 宏,内联函数通过避免被调用的开销来提高执行效率,尤其是它能够通过调用(“过程化集成”)被编译器优化。

C++内联函数与宏定义

一曲冷凌霜 提交于 2019-12-26 06:12:40
用内联取代宏: 1.内联可调试; 2.可进行类型安全检查或自动类型转换; 3.可访问成员变量。 另外,定义在类声明中的成员函数自动转化为内联函数。 文章(一) 内联函数与宏定义   在C中,常用预处理语句#define来代替一个函数定义。例如:     #define MAX(a,b) ((a)>(b)?(a):(b))   该语句使得程序中每个出现MAX(a,b)函数调用的地方都被宏定义中后面的表达式((a)>(b)?(a):(b))所替换。   宏定义语句的书写格式有过分的讲究, MAX与括号之间不能有空格,所有的参数都要   放在括号里。尽管如此,它还是有麻烦:     int a=1,b=0;     MAX(a++,b); //a被增值2次     MAX(a++,b+10); //a被增值1次     MAX(a,"Hello"); //错误地比较int和字符串,没有参数类型检查     MAX( )函数的求值会由于两个参数值的大小不同而产生不同的副作用。     MAX(a++,b)的值为2,同时a的值为3;     MAX(a++,b+10)的值为10,同时a的值为2。   如果是普通函数,则MAX(a,"HellO")会受到函数调用的检查,但此处不会因为两个参数类型不同而被编译拒之门外。幸运的是,通过一个内联函数可以得到所有宏的替换效能和

Link-Cut-Tree详解

久未见 提交于 2019-12-26 05:32:40
图片参考 YangZhe的论文 , FlashHu大佬的博客 Link-Cut-Tree实际靠的是实链剖分,重链剖分和长链剖分珂以参考 树链剖分详解 Link-Cut-Tree将某一个儿子的连边划分为实边,而连向其他子树的边划分为虚边 区别在于虚实是可以动态变化的,因此要使用更高级、更灵活的Splay来维护每一条由若干实边连接而成的实链 请先学习 Splay 之后再阅读本文 Link-Cut-Tree功能强大,能维护以下东西: 查询、修改链上的信息(最值,总和等) 随意指定原树的根(即换根) 动态连边、删边 动态维护连通性 更多毒瘤操作 Link-Cut-Tree的性质 1.每一个Splay维护的是一条从上到下按在原树中深度严格递增的路径,且中序遍历Splay得到的每个点的深度序列严格递增 2.每个节点包含且仅包含于一个Splay中 3.边分为实边和虚边,实边包含在Splay中,而虚边总是由一棵Splay指向另一个节点(指向该Splay中中序遍历最靠前的点在原树中的父亲) 因为性质2,当某点在原树中有多个儿子时,只能向其中一个儿子拉一条实链(只认一个儿子),而其它儿子是不能在这个Splay中的 那么为了保持树的形状,我们要让到其它儿子的边变为虚边,由对应儿子所属的Splay的根节点的父亲指向该点,而从该点并不能直接访问该儿子(认父不认子) 核心操作(以下代码以 Luogu

inline function vs #define [duplicate]

假如想象 提交于 2019-12-25 04:02:28
问题 This question already has answers here : Closed 8 years ago . Possible Duplicate: Inline functions vs Preprocessor macros In C++ the inline function qualifier basically replaces the function as a #define directive, rather than making the function being called over and over again. Thus reducing overhead time, but at the same time increasing program size. If my understanding of inline function is correct, what is the different, of inline and #define? 回答1: inline is only a hint, which the

inline virtual method in template class

对着背影说爱祢 提交于 2019-12-25 01:59:46
问题 I have a template base class with a get_p_pow method that is called by a foo function: template <typename T_container> class base { public: int foo() { ... get_p_pow(p_pow, delta_p); ... } ... protected: virtual T_container& get_p_pow(T_container &p_pow, double delta_p) const { p_pow(0) = 1.0; p_pow(1) = delta_p; for (difference_type i = 2; i <= order; ++i) { p_pow(i) *= p_pow(i-1)*delta_p; } return p_pow; } int order; }; For some derived classes, the value of order is set to a specific

C++ template, static function specialization

萝らか妹 提交于 2019-12-24 16:51:36
问题 I have a syntax error with my template I would like to partial specialize a static function of my template class class.hpp template <typename Foo, size_t bar = 26> class MyClass { MyClass(); static void function(); }; #include "class.tpp" class.tpp template <typename Foo, bar> MyClass<Foo, bar>::MyClass() { } template <typename Foo> inline void MyClass<Foo, 6>::function() { // ... } template <typename Foo> inline void MyClass<Foo, 26>::function() { // ... } error: template definition of non

C++ template, static function specialization

大城市里の小女人 提交于 2019-12-24 16:51:04
问题 I have a syntax error with my template I would like to partial specialize a static function of my template class class.hpp template <typename Foo, size_t bar = 26> class MyClass { MyClass(); static void function(); }; #include "class.tpp" class.tpp template <typename Foo, bar> MyClass<Foo, bar>::MyClass() { } template <typename Foo> inline void MyClass<Foo, 6>::function() { // ... } template <typename Foo> inline void MyClass<Foo, 26>::function() { // ... } error: template definition of non

Image and text on same line?

陌路散爱 提交于 2019-12-24 14:26:06
问题 This is giving me a headache... I'm trying to have an image of fixed height/width on the left, and text on the right, in the same line of course. The overall container has a dynamic width of 90% of viewport, meaning that the text on the right will also have a dynamic width (90% - image width) since the image on the left is fixed. The text needs to be aligned left, so "float:right" won't work. I've tried countless combinations of floats, aligns, table cells, etc, nothing works... closest I've