[英]Cast a void pointer to a struct or memcpy to new struct?
我正在将void *
作为参数传递给函数foo(void* parm)
的参数,该函数调用函数bar(STmyStruct* parm)
我应该将void指针转换为STmyStruct*
还是创建一个新结构,memcpy void*
指向和然后将指针传递给该结构? 我想解决方案A更有效?
A: foo(void* parm)
{
bar((STmyStruct*) parm)
}
B: foo(void* parm)
{
STmyStruct myStr;
memcpy(&myStr, parm, sizeof(STmyStruct));
bar(&myStr)
}
bar(STmyStruct* mystr);
void*
,请这样做。 但是您可能受到现有API的约束。 void*
实际上指向STmyStruct*
,则进行STmyStruct*
。 void*
不是指向STmyStruct*
而是某种与布局兼容的(因此跨STmyStruct*
是合法的),这种情况很少见,那么由于别名规则或风险,您必须选择选项B混淆了编译器。 实际上,这两个解决方案做不同的事情,解决方案A是您通过引用传递参数,因此,如果您在函数bar
更改,则将更改传递给foo
,这意味着:
STmyStruct test;
// your code that uses test
foo(test);
如果功能栏更改了mystr参数,您也将更改测试。
但是在解决方案B中,您将使用memcpy复制参数parm
,因此,如果功能bar
更改其参数,则不会更改parm
。 它的意思是:
STmyStruct test;
// your code that uses test
foo(test);
即使您在功能bar
更改参数mystr
,测试也不会更改,因为您将其值复制到myStr
。
这取决于您的用例。 通常,假设parm
确实指向STMyStruct
类型的对象,两者都很好。
如果bar
修改了mystr
并且您想要修改原始param
,则必须使用选项A。
如果它修改了mystr
并且您不希望修改param
,则需要选项B。
如果bar不修改mystr
,那么A会更有效,但是B也不会有问题。 (除非B在任何地方都存储了指向mystr
的指针。)
这取决于您是否希望bar
修改具有指针的项目,还是希望它在副本上工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.