Tag: 内部的

java接口如何在内部实现? (虚函数表?)

C ++有多重inheritance。 在汇编级别实现多重inheritance可能相当复杂,但是在线上有很好的介绍如何正常完成(vtables,pointer fixups,thunk等)。 Java没有多个实现inheritance,但是它有多个接口inheritance,所以我不认为每个类都有一个单独的vtable可以实现这一点。 java如何在内部实现接口? 我意识到,与C ++相反,Java是Jit编译的,所以不同的代码段可能会有不同的优化,而不同的JVM可能会做不同的事情。 那么,是否有一些JVM遵循的一般策略,或者是否有人知道特定JVM中的实现? 另外JVM经常虚拟化和内联方法调用,在这种情况下根本就没有涉及到vtable或等价物,所以询问实现虚拟/接口方法调用的实际汇编序列是没有意义的,但是我认为大多数JVM仍然保留一些如果它们没有能够虚拟化所有的东西,那么可以使用类的一般表示。 这个假设是错误的吗? 这种表示看起来像一个C ++的vtable? 如果是的话,接口是否有单独的vtables,这些如何与类vtable相关联? 如果是这样,对象实例可以有多个vtable指针(类/接口vtables),就像C ++中的对象实例一样? 类types和接口types对同一对象的引用总是具有相同的二进制值,或者它们可以不同,就像在C ++中需要指针修正一样? (仅供参考: 这个问题对CLR提出了类似的问题 ,在这篇msdn文章中似乎有一个很好的解释,尽pipe现在可能已经过时了,但我还没有find类似于Java的东西。 编辑: 我的意思是“实现”的意思是“GCC编译器如何实现整数加法/函数调用/等”,而不是“Java类ArrayList实现List接口”的含义。 我知道这是如何在JVM字节码级别上工作的,我想知道的是JVM在加载类文件和编译字节码之后生成的是什么样的代码和数据结构。

fork()如何知道何时返回0?

以下面的例子: int main(void) { pid_t pid; pid = fork(); if (pid == 0) ChildProcess(); else ParentProcess(); } 所以纠正我,如果我错了,一旦fork()执行一个subprocess创build。 现在通过这个答案 fork()返回两次。 这是一次为父进程,一次为subprocess。 这意味着两个独立的进程在fork调用期间生成,而不是在结束之后生成。 现在我不明白它如何理解如何为subprocess返回0和为父进程正确的PID。 这在哪里变得非常混乱。 这个答案指出fork()通过复制进程的上下文信息并手动将返回值设置为0来工作。 首先我正确地说,返回任何函数都放在一个寄存器中? 由于在单个处理器环境中,一个进程只能调用一个只返回一个值的子例程(如果我在这里错了,请纠正我)。 比方说,我在一个例程中调用一个函数foo(),该函数返回一个值,该值将被存储在一个寄存器中,比如BAR。 每次函数想要返回一个值,它都将使用一个特定的处理器寄存器。 所以,如果我能够手动更改过程块中的返回值,我可以更改返回到该function的值? 所以我正确地认为fork()是如何工作的?

Git在哪里存储子模块提交的SHA1?

我知道,当你添加一个子模块到git仓库时,它会跟踪它的sha1引用的子模块的一个特定的提交。 我试图find这个sha1值存储在哪里。 .gitmodules和.git/config文件仅显示子模块的path,而不显示提交的sha1。 git-submodule(1)的引用只是提到一个gitlink条目, gitmodules(5)的引用也没有提到这个。

R中的因素:多一个烦恼?

R中的基本数据types之一是因素。 在我的经验中,因素基本上是一种痛苦,我从不使用它们。 我总是转换成字符。 我觉得很奇怪,我错过了一些东西。 是否有一些重要的使用因子作为因子数据types变得必要的分组variables的函数示例? 我应该使用因素有什么具体情况?