register 优化
register 说明符仅在声明于块作用域或函数形参列表中的对象时允许使用。它指示自动存储期,其正是这种声明的缺省情况。另外,此关键词的存在可用于提示优化器将此变量的值存储于 CPU 寄存器。此关键词于 C++11 被弃用。
——cppreference
register 不能声明全局变量。它的作用是告诉编译器这个变量会多次使用,可以不在内存中开辟空间而直接使用 CPU 寄存器。在 C++11 标准中,register 被停止使用。但为了使以前的代码能够正常工作,所以保留了 register 声明局部变量的作用,即与 C+ + 11 之前 auto 的作用相同。
另外,在 C 语言中,使用register 声明的变量不允许取地址操作;而在 C++ 中,使用 register 声明的变量可以进行取地址操作,此时编译器会忽略 register。
虽然 register 从 C++11 起弃用,但不开优化时 gcc 仍然会根据 register 处理变量,而 clang 则会完全忽略 register。
inline 优化
inline 关键词的本意是作为给优化器的指示器,以指示优先采用函数的内联替换而非进行函数调用,即并不执行将控制转移到函数体内的函数调用 CPU 指令,而是代之以执行函数体的一份副本而无需生成调用。这会避免函数调用的开销(传递实参及返回结果),但它可能导致更大的可执行文件,因为函数体必须被复制多次。
因为关键词 inline 的含义是非强制的,编译器拥有对任何未标记为 inline 的函数使用内联替换的自由,和对任何标记为 inline 的函数生成函数调用的自由。这些优化选择不改变上述关于多个定义和共享静态变量的规则。
——cppreference
简单来说: inline用于操作简单的函数,如
inline int max(int a,int b){
return a < b ? b : a;
}
如果是多次调用则inline 无效,函数体被复制多次导致浪费空间
注:转自