带访问修饰符的编程语言是否根据访问级别执行任何优化?

时间:2013-12-03 19:51:34

标签: optimization language-agnostic compilation programming-languages

问题直截了当。

当符号,关键字等存在访问修饰符时,哪些语言编译器会执行优化或编译怪癖?

作为奖励:是否有优化,没有访问修饰符的语言编译器可以做到这一点不能? (换句话说,访问修饰符会阻止程序员控制的优化)

修改

准确地说,我特指的是像public,private和protected这样的关键字,或者类似的构造。

2 个答案:

答案 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”。