gpt4 book ai didi

c++ - 我可以安全地转换为返回 void 的函数吗?

转载 作者:行者123 更新时间:2023-11-27 22:35:22 25 4
gpt4 key购买 nike

由于显而易见的原因,在采用不同参数或返回不同类型的函数类型之间进行转换是不安全的。

(对我而言)不明显的是,转换为返回类型为 void(并且参数类型相同)的函数指针类型是否应该安全。

是否有一种机制可以安全地转换为实例 int (*)()void (*)()static_cast在这里失败。 reinterpret_cast有效,但不安全。

有安全的方法吗?

std::function<void()>(funcReturningInt)似乎成功了,但我似乎无法通过它的迷宫式实现来了解如何实现。

最佳答案

没有安全的转换。

根据c++标准的答案由另一个答案给出,这里我想实际解释一下为什么会这样。

有多种处理返回值的方法,C/C++没有定义或限制如何处理返回值。它们在 ABI 中定义。

在 X86 ABI 中定义了几个调用约定,如 cdeclstdcallthiscall。不同的调用约定处理返回值的方式不同,这里最相关的事实是返回值存储在哪里。

如果返回值存储在堆栈中,调用者必须在检索返回值后调整堆栈指针。在这种情况下,如果您将返回值转换为 void,那么调用者将无法调整堆栈指针,通常情况下堆栈已损坏,这通常会导致崩溃。

如果返回值存储在寄存器中,调用者可能会假设在调用返回 void 的函数时这些寄存器没有被修改,但如果没有,这些寄存器可能会被被调用者修改。分歧也可能导致崩溃。

如果您坚持使用类型转换,只需确保您选择了返回值不影响的正确调用约定即可。

关于c++ - 我可以安全地转换为返回 void 的函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55015082/

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