怎样通过网盘做电影网站,试玩网站源码,网站建设企业营销,彩票网站和app建设一、介绍
在c的发展过程中#xff0c;无论如何发展#xff0c;c都尽量保持着与C语言的兼容#xff0c;当然这也是它的一个特点。在实际的应用中#xff0c;开发者经常遇到的一个问题是#xff0c;如何把一个指针的值给传出来#xff1f;有人会说#xff0c;简单啊…一、介绍
在c的发展过程中无论如何发展c都尽量保持着与C语言的兼容当然这也是它的一个特点。在实际的应用中开发者经常遇到的一个问题是如何把一个指针的值给传出来有人会说简单啊直接返回不就行了。当然这样是可以的但是如果不想通过返回值返回呢返回值另有它用 在普通的变量中可以通过引用“”来实现类似下面的代码
int test(int a)
{a 10;return a;
}指针是不是也可以这样做呢当然可以同时它还可以使用双重指针来实现看下面的代码
int test(char * p1,int **p2)
{*p1 c;*pt2 data;return 0;
}这在许多的开源框架中经常看二级指针的原因。可是在c中随着新标准的推出智能指针开始广泛在程序中应用那么智能指针怎么产生上面的应用呢引用智能指针本身就是一种引用计数器。再或者转回到普通指针可是在智能指针和普通指针间来回转又是大忌。
二、INOUT和OUT指针
在c23的提案中有一个INOUT和OUT的智能指针定义即std::inout_ptr,std::out_ptr。两者的区别是前者可以既可输入又可输出而后者只能输出。这是什么意思呢就是说智能指针如果纯输出则输入进去的智能指针只做一个Reset动作否则会做一个Release动作后再做一个Reset动作。举一个简单的场景就是转入一个空的智能指针然后纯输出一个创建成功的智能指针而如果有个已经使用的智能指针想重用就可以用std::inout_ptr,Release和Reset就自动处理了。这有点类似于C中的remalloc函数。 可能有些开发者在阅读一些开源框架或者源码中会发现一个函数的参数前有类似的IN或者OUT的定义跳转过去发现只是一个宏定义的空值目的当然是让代码看上去更友好。那么在c23中如何使用呢
auto ptr std::unique_sharedint();void outSmartptr(int ** ptr){}testSmartptr(std::out_ptr(ptr));
testSmartptr(std::inout_ptr(ptr));可见这两个指针就是隐匿的转化成T**。当然在C语言中会有好多分配内存中会使用void *这种机制所以这两个指针也要支持这种自动转换。另外和智能指针一样这两个指针也支持自定义删除器类似于
malloc_mem(std::out_ptr(ptr,[](auto t){free_mem(t);}));好的注意点来了。前面提到了std::out_ptr支持任意Reset的成员指针所以它支持所有的智能指针而std::inout_ptr既要Release又要Reset所以它不支持std::shared_ptr。
三、总结
所以说应用场景推动了标准的前进。一切的技术手段最终的目的是为实际应用服务的。脱离了这一导向技术最终会走向华而不实然后被淘汰。c之所以开始快速迭代新的标准目的也不外乎于此。毕竟只有变化发展才是永恒的真理。