引言  inline函数 在函数声明或定义中函数返回类型前加上关键字inline即把min()指定为内联. inline函数对编译器而言必须是可见的,以便它能够在调用点内展开该函数.与非inline函数不同的是,inline函数必须在调用该函数的每个文本文件中定义.当然,对于同一程序的不同文件,如果inline函数出现的话,其定义必须相同. 为保证不会发生这样的事情,建议把inline函数的定义放到头文件中.在每个调用该inline函数的文件中包含该头文件.这种方法保证对每个inline函数只有…
Understand the ins and outs of inlining.   [原理] Inline函数背后的做法是将“对函数的每一个调用”都用函数本体(function body)替换之.其好处是: 可以消除函数调用所带来的开销. 编译器最优化机制通常被设计用来浓缩那些“不含函数调用”的代码,因此当你inline某个函数,或许编译器有能力对它(函数本体)执行语境相关最优化.大部分编译器不会为一个“outlined函数调用”执行这种最优化动作. 然而inline函数这些美好的一面也伴随着…
将大多数inlining限制在小型.被频繁调用的函数身上.这可使日后的调试过程和二进制升级(binary upgradability)更容易,也可使潜在的代码膨胀问题最小化,使程序的速度提升机会最大化. 不要只因为function templates出现在头文件,就将它们声明为inline.…
1.inline方法相当于文本替换,不需要承担方法调用的额外开销,同时还有潜在的优势,文本替换后,编译器会进行代码优化.而对于方法调用,编译器没有能力进行代码优化. 2.显而易见,inline方法往往会导致目标代码膨胀变大.但是,对于方法本体很小的情况,可能会出现,替换后的文本比方法调用的代码还要小.这也意味着,一般情况下,只有方法本体比较小的情况,才应该声明为inline. 3.特别注意:inline只是一个申请,而不是命令.同时,对于class定义中的方法实现,也暗示着申请inline.申请…
NOTE: 1.将大多数inline限制在小型 被频繁调用的函数身上.这可使日后的调试过程和二进制升级(binary upgradability)更容易,也可使潜在的代码膨胀问题最小化, 使程序的速度提升机会最大化. 2.不要只因为 function templates 出现在头文件,就将他们声明为inline.…
避免过度同步(67):在一个被同步的方法或代码块中,不要调用哪些被设计成被覆盖的方法或者是由客户端以函数对象的形式提供的方法(21). 有点拗口,书上提供的创建者与观察者模式,add方法太多,看得眼花缭乱,重新写了一个例子: package com.example.demo.effective; public interface Believer { void confide(); } package com.example.demo.effective; import com.google.c…
Declare destructors virtual in polymorphic base classes.   [原理] C++指出,当derived class对象经由一个由base class类型的指针删除时,如果这个base class 拥有一个non-virtual的析构函数,那个析构的结果将是未定义的.即通常情况下是该对象的base class成分会被析构掉,但是其derived class成分没有被销毁,甚至连derived class的析构函数也不会被调用. 于是形成一个被“…
异常转译:当位于最上层的子系统不需要关心底层的异常细节时,常见的作法时捕获原始异常,把它转换一个新的不同类型的异常,在将新异常抛出. 通常方法捕获底层异常,然后抛高层异常. public static long write2File(String dataStr, String filePath) { long fileSize = 0L; try ( RandomAccessFile raf = new RandomAccessFile(createFileAbsolute(filePath)…
背景: 在Java编程过程中,如果打开了外部资源(文件.数据库连接.网络连接等),我们必须在这些外部资源使用完毕后,手动关闭它们.因为外部资源不由JVM管理,无法享用JVM的垃圾回收机制,如果我们不在编程时确保在正确的时机关闭外部资源,就会导致外部资源泄露,紧接着就会出现文件被异常占用,数据库连接过多导致连接池溢出等诸多很严重的问题. 传统关闭资源方式(一般JDK版本低于1.7) /** * 根据路径创建文件,如果路径文件夹不存在,就创建 * @param filePath * @return…
inline可以带来各种好处: 首先其可以使得消除函数调用带来的开销,再者编译器对这种非函数的代码可以做出更多的优化策略.   但是inline函数首先肯定是会导致程序代码的大小更加的庞大,这样会带来代码膨胀,造成的损害首先就是会导致计算机额外的换页行为,降低指令告诉缓存的集中率,这要就会带来效率上的损失.   所以说,使用inline的关键点就在于,如果inline函数的本体很小的话,那么inline函数展开的代码大小可能比调用非inline函数展开的代码更小,这样就可以提高缓存的击中率,从而…