我有一个例程,它将一个void *传递给一个结构。在里面 例程我将其转换为正确的类型,例如
SomeFunc(void* pMsg) {
printf("Event = %d\n", static_cast<struct MyEventMsg*>(pMsg)->Event);
}
如果我访问结构的许多成员,代码看起来很漂亮 乱。我可以创建一个正确类型的新指针并分配它 cast void *,但似乎没有必要创建 一个临时变量,仅用于此目的。有什么方法可以演员 参数pMsg到正确的类型?
由于 道格
答案 0 :(得分:4)
创建正确类型的指针并为其指定void *的转换是正确的方法。如果为指针选择“好”名称,它将使代码更短,更容易阅读。
你说你认为指针“不必要”。如果这是因为您认为存在与之关联的运行时成本,您可能会发现编译器将为您消除指针。
答案 1 :(得分:2)
做你问的方法是
SomeFunc(void* pMsg) {
MyEventMsg * pM = static_cast<struct MyEventMsg*>(pMsg);
printf("Event = %d\n", pM->Event);
printf("Something Else = %d\n", pM->SomeOtherMember);
...
}
但我会推荐一些更多的C ++:
SomeFunc(MyEventMsg &Msg) { // consider making this const
cout << "Event = " << Msg.Event << endl;
cout << "Something Else = " << Msg.SomeOtherMember << endl;
...
}
答案 2 :(得分:1)
不,事实上它应该是。静电铸造是您的最佳选择。不要担心临时。它很可能会被编译器优化掉
答案 3 :(得分:1)
跟临时一起去吧。如果你正确管理所有东西(如果甚至需要管理),它不会给你带来任何问题。我想你的temp也会更快,因为你只需要进行一次转换,而不是为结构的每个成员转换EVERYTIME。
答案 4 :(得分:1)
第一个问题是为什么函数首先采用void*
。如果将其更改为指针的确切类型,则问题将完全消失。
如果你要在函数中多次使用指针(在转换为适当的类型之后),我只需创建一个给定类型的局部变量,一次转换然后使用它。至于创建这样一个变量的成本,在很多情况下编译器会优化变量(如果你怀疑,请查看生成的汇编)。
答案 5 :(得分:0)
嗯,不是:就像你说的那样,你可以就地进行演员。但似乎没有必要为此目的创建一个临时变量
做出选择:每次施放(凌乱)或施放一次正确类型的变量(干净)。
答案 6 :(得分:0)
将pMsg
的类型更改为struct MyEventMsg *
并创建第二个内联版本的方法,该方法采用void *
,投射它并调用第一个。
您可以通过将其设为私有来阻止对第一种方法的调用。