gpt4 book ai didi

c++ - 抽象函数参数格式及其对性能的影响?

转载 作者:太空狗 更新时间:2023-10-29 23:17:18 25 4
gpt4 key购买 nike

我正在开发一个 VM,我希望能够调用已编译的函数。然而,因为每个函数最终可能有不同的签名,我的计划是将所有调用归纳为 2 种可能的场景——调用没有返回值和参数的函数,以及调用接受一个 void * 的函数 参数。

计划以类似于 thiscall 的方式使用它 - 所有参数都在传递的指针位置正确对齐,并通过间接检索参数。不应该比从堆栈中读取它们慢,至少在我看来是这样。

所以代替:

int foo(int a, int b) { return a+b; }

我可以有这样的东西:

void foo2(void *p) {
*(int*)p = *(int*)(p + 4) + *(int*)(p + 8);
}

所以我的问题是使用这种方法可能会出现什么问题?我马上就能知道它是“在黑暗中”工作的,因此正确计算偏移量至关重要。这也有点不方便,因为所有临时文件都需要由用户提供。假设我的 VM 编译器会处理这两个问题,我最关心的是性能——我不想创建一个普通函数,并且为每个普通函数创建一个 void * 包装器——我想直接对所有函数都使用该约定,所以我不禁想知道编译器在编译代码中使用内联函数时会做得多好?是否会有我忽略的任何其他可能的性能影响(不包括 __fastcall,它将使用更多的寄存器和更少的间接寻址)?

最佳答案

在性能方面(和易用性)你可能最好使用 cdecl - 一切都进入堆栈。 C 标准允许您指定带有任意参数的函数原型(prototype)

typedef void (__cdecl * function_with_any_parameters)();

您必须确保将所有希望调用的函数定义为:

void __cdecl f(type1 arg1, type2 arg2, type3 arg3); // any amount of arguments

只需使用适当数量的参数调用它们:

f(arg1, arg2, arg3, arg4);

如果你想通过一个指针,那么你会有额外的开销:一个指针。最简单的方法是将所有函数定义为接受指向匿名结构的指针:

void f(struct {type1 a; type2 b;} * args);

然后您可以使用指向适当结构的指针调用该函数以避免任何未对齐。

struct {type1 a; type2 b;} args = {arg1, arg2};
f(&args);

您正在有效地自行实现 cdecl

关于c++ - 抽象函数参数格式及其对性能的影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18695749/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com