小编Zac*_*ith的帖子

编程语言理念:避免vtable查找

我一直在想一个编程语言的想法:它本质上是C++和类似Java的语法,用于系统编程(或者实际上任何需要高性能的编程),但在我看来,比C++更令人愉快的语法.我在考虑如何处理分层类结构中的虚方法(我的语言不包括多重继承),以及避免vtable查找的方法.我的问题是双重的:

  1. 根据我的理解,vtable查找是如此受性能影响的原因(至少在游戏开发等时间关键场景中)是因为它需要引用对象vtable指针,而这个vtable通常是缓存未命中.这是正确的,还是我错过了部分问题?
  2. 我对部分解决方案的想法是:如果编译器可以完全确定对象的类型(即,它不能是从它认为的类型派生的类型),并且该对象作为参数传递给函数,其类型是对象类型的超类,然后函数中调用的虚方法的位置可以作为一种"隐藏"参数传递,该参数在编译时添加.也许一个例子会有所帮助:

考虑以下类层次结构的伪代码:

class Animal {
    public void talk() { /* Generic animal noise... */ }
    // ...
}

class Dog extends Animal {
    public void talk() { /* Override of Animal::talk(). */ }
    // ...
}

void main() {
    Dog d = new Dog();
    doSomethingWithAnimal(d);
}

void doSomethingWithAnimal(Animal a) {
    // ...
    a.talk();
    // ....
}
Run Code Online (Sandbox Code Playgroud)

请记住,这是伪代码,而不是C++或Java或类似代码.另外,假设Animal参数通过引用隐式传递,而不是值.因为编译器可以看到它d绝对是类型Dog,它可以将doSomethingWithAnimal定义转换为如下所示:

void doSomethingWithAnimal(Animal a, methodptr talk = NULL) {
    // ...
    if ( talk != NULL …
Run Code Online (Sandbox Code Playgroud)

c++ compiler-construction programming-languages vtable compiler-optimization

4
推荐指数
1
解决办法
915
查看次数

用#![no_std]测试板条箱

我正在为Rust中的编程语言实现编写运行时.我打算在这个运行时链接我生成的编译代码,所以我不想依赖于std保持二进制小.问题是,当我尝试cargo test我的运行时,我得到错误说std::slice::AsSlice无法找到,我发现一些谷歌搜索之后是因为一些测试工具需要std库代码.

有没有人对如何测试此代码有任何建议?有没有办法有条件地包含#![no_std]pragma,即在测试时仍然包含std库?我还尝试创建一个单独的测试包,其中包含std库,extern crate将运行时包放入其中并在那里运行我的测试,但这引入了一组全新的问题.

testing rust

4
推荐指数
2
解决办法
1205
查看次数