问题直截了当。
当符号,关键字等存在访问修饰符时,哪些语言编译器会执行优化或编译怪癖?
作为奖励:是否有优化,没有访问修饰符的语言编译器可以做到这一点不能? (换句话说,访问修饰符会阻止程序员控制的优化)
修改
准确地说,我特指的是像public,private和protected这样的关键字,或者类似的构造。
答案 0 :(得分:1)
在OO语言中,动态调度方法调用。如果编译器/运行时可以发现该方法只存在一个实现,并且该方法不会发生变化,则可以执行更积极的优化。
从这个角度来看,private
方法应该更容易优化。同样,属于sealed
的类的方法也更容易优化。
我说"更容易"因为现代编译器/运行时无论如何都会优化很多东西,但是他们需要依靠防护来确保优化被“优化”#34;如果某些假设失效。请参阅Brian Goetz的this blog post。
答案 1 :(得分:0)
首先,语言不执行优化,而编译器则执行优化。因此答案(通常)取决于编译器实现和您指定的编译器选项。
大多数C ++编译器根据 const 关键字执行大量优化:它们预先计算可在编译时计算的所有内容,等等。
例如,考虑函数“fraction”中的代码:
const double yet_another_pi = 3.14;
double denominator() {
return sqrt( 2*yet_another_pi );
}
double fraction( double numerator )
{
return numerator / denominator();
}
此代码将通过预计算的sqrt倒数(2 * 3.14)在分子的单个乘法中生成大多数编译器。
如果没有const关键字,相同的代码将导致乘以2和函数“分母”内的平方根,然后在函数“fraction”中进行除法。
还有许多其他修饰符示例可以改进优化。其中一些(例如强制执行某些对齐)具有平台相关效果。
如果您询问访问修饰符的可用性是否会阻止优化,则答案为“否”。
如果您询问访问修饰符的用法是否会阻止优化,则答案为“是”:如果您将 volatile 关键字应用于代码性能中的每个变量,因为易失性变量无法在寄存器中进行优化,所以要去掉。
编辑:根据对此答案的评论,问题可能是关于私人/受保护/公共关键字。我不知道与这些关键字相关的任何优化,除了相关的Java的关键字“final”。