我读了一些关于提升和重新排序的内容,因此似乎Java VM可能会选择提升某些表达式.我还读到了在Javascript中提升函数声明的问题.
第一个问题: 有人可以确认在C,C++和Java中是否通常存在提升?或者它们都依赖于编译器/优化?
我读了很多示例C代码,它们总是在任何断言或边界条件之前将变量声明置于顶部.我认为在变量声明之前执行所有断言和边界情况会更快一些,因为函数可能只是终止.
主要问题: 变量声明必须始终在上下文中排在最前面吗?(这里有提升工作吗?)或者编译器是否通过首先检查这些独立的断言和边界情况(在无关变量声明之前)来自动优化代码?
这是一个相关的例子:
void MergeSort(struct node** headRef) {
struct node* a;
struct node* b;
if ((*headRef == NULL) || ((*headRef)->next == NULL)) {
return;
}
FrontBackSplit(*headRef, &a, &b);
MergeSort(&a);
MergeSort(&b);
*headRef = SortedMerge(a, b);
}
Run Code Online (Sandbox Code Playgroud)
如上所示,边界情况不依赖于变量"a"和"b".因此,将边界情况放在变量声明之上会使它稍快一些吗?
更新:
上面的例子并不像我希望的那样好,因为变量"a"和"b"只是声明,而不是在那里初始化.在我们确实需要使用它们之前,编译器会忽略声明.
我通过初始化检查了GNU GCC程序集的变量声明,程序集具有不同的执行顺序.编译器没有改变我对独立断言和边界情况的排序. 因此,重新排序这些断言和边界情况会改变程序集,从而改变机器运行它们的方式.
我认为差异是微不足道的,大多数人从不关心这一点.
这可能只是Java迭代器构造函数的签名布局的问题.
必须T
在类定义中指定迭代器类型(作为抽象类型或其他东西); 那么,为什么它的相应构造函数public GunmenIterator(List list)不 包含这个T
迭代器类型呢?虽然通常T
在迭代器中使用通用类型,但这只是一种设计选择以匹配其他方法吗?
public class GunmenIterator<T> implements Iterator<T> {
private List<T> list;
private Iterator<T> iter;
public GunmenIterator(List<T> list) {
this.list = list;
this.iter = list.iterator();
}
public static void main(String[] args) {
Iterator<Integer> gunmenIter = new GunmenIterator<Integer>(gunmen);
}
}
Run Code Online (Sandbox Code Playgroud)
如上所示,迭代器类型<Integer>
应该存在于初始化中(否则,将出现编译器警告).但是,<T>
无法添加到构造函数的签名中.
我有两个迭代器(A_subseq 和 B_subseq),每个迭代器都有两个产量输出(来自 A_subseq 的 Aseq 和 Ahseq)。我需要保留两个迭代器的索引计数。如果我可以将两个 for 循环合并为一个循环,就可以做到这一点。
a 和 b 都是迭代器。k只是一个常数整数。
a_count = 0
b_count = 0
A_subseq = subsequenceHashes(a,k)
B_subseq = subsequenceHashes(b,k)
Match = Multidict()
for Aseq,Ahash in A_subseq:
Match.put(Ahash,Aseq)
for Bseq,Bhash in B_subseq:
b_count += 1
if Bseq in Match.get(Bhash):
yield xxx
Run Code Online (Sandbox Code Playgroud)
有谁知道我是否可以将这两个 for 循环结合起来,以便我可以同时计数 a_count 和 b_count?
java ×2
c ×1
c++ ×1
generics ×1
iterator ×1
javascript ×1
optimization ×1
python ×1
signature ×1