[英]reinterpret_cast to function pointer
我用reinterpret_cast<T>
进行了实验编写的代码
#include <iostream>
#include <cstdlib>
using std::cout;
using std::endl;
int foo()
{
cout << "foo" << endl;
return 0;
}
void (*bar)();
int main()
{
bar = reinterpret_cast<void (*)()>(foo); //Convertion a function type to a pointer to function type
bar(); //displays foo. Is it UB?
}
首先,为什么允许这样的reinterpret_cast
转换? 我认为这种转变是不正确的。
标准 (C ++11§5.2.10/ 6)说
指向函数的指针可以显式转换为指向不同类型函数的指针。 通过指向函数类型的指针调用函数的效果是未定义的,该函数类型与函数定义中使用的类型不同。 除了将“指向T1的指针”的prvalue转换为“指向T2的指针”类型(其中T1和T2是函数类型)并返回其原始类型产生原始指针值之外,这种指针转换的结果未指定。
所以它是未定义的行为。
通过指向不同函数类型的指针进行正式调用的是Undefined Behavior(C ++11§5.2.10/ 6)。
在实践中,您将丢弃int
类型的函数结果,该结果将在寄存器中返回。 因此,当您通过铸造指针调用时可能发生的最坏情况是,这与编译器的期望相反,寄存器已经改变了值。
另一个实际考虑因素:C ++不支持在函数和数据指针之间进行转换,但是Posix实际上需要转换为void*
并返回工作正常。 C ++限制可能支持哈佛架构机器,其中指令不是通过与普通数据相同的总线和存储器检索的。 但Posix往返可能也适用于这种架构,除非数据地址空间远小于指令地址空间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.