为了安全起见,我已经在 DLL 调用中使用旧式函数指针,如下所示:
// DLL
typedef int (__stdcall* ty)();
void test(ty t)
{
if (t)
{
int r = t();
....
}
}
而我可以使用这个:
void test(std::function<int()> t)
{
}
然而,众所周知,后者使用类型擦除 https://stackoverflow.com/questions/14936539/how-stdfunction-works. std::function
不能是原始函数指针(因为它可能会传递一个具有捕获的 lambda,因此不能是原始指针)。
因此,在 Visual Studio 中,使用发布模式下的 DLL 构建,其函数签名包含std::function
在调试模式下从可执行版本使用时会崩溃,反之亦然。即使同时处于调试或发布模式,行为也不相同。有时它会崩溃,有时它会起作用。
是否有我们可以依赖使用的定义的运行时行为std::function
?或者这是一个仅编译的东西,由编译器根据我传递给它的内容进行专门化,因此不能假定运行时行为?
在汇编级别,预编译单元上的函数签名必须已知。据我所知std::function
runtime实施没有明确定义。
所以,例如,当我编译时,那么
void test(std::function<int()> t)
可以接受任何参数,例如[]() -> int, [&]() -> int, [=]() -> int
等通过类型擦除。但是,当这是预编译的并且仅是运行时时,可以接受什么? std::function 是如何实现的?用类指针?有没有明确的方法?
我并不是在寻找必然与 VS 相关的解决方案,而是在寻找一个标准定义std::function
,如果有的话。