草庐IT

c++ - 如何使用 tmpfile () 获取临时文件名

这个问题在这里已经有了答案:Isthereawaytogetthefilenamefroma`FILE*`?[duplicate](2个答案)关闭6年前。tmpfile()函数说:Thetemporaryfilecreatedisautomaticallydeletedwhenthestreamisclosed(fclose)orwhentheprogramterminatesnormally.Iftheprogramterminatesabnormally,whetherthefileisdeleteddependsonthespecificsystemandlibraryimple

c++ - 关于将 const 引用绑定(bind)到临时对象的子对象

代码如下#includestructP2d{doublex,y;P2d(doublex,doubley):x(x),y(y){}~P2d(){printf("Destructorcalled\n");}};P2dcenter(){returnP2d(10,10);}intmain(intargc,constchar*argv[]){constdouble&x=center().x;printf("x=%.18g\n",x);return0;}g++(版本5.2.0)将在中输入printf之前销毁P2d临时实例main,但该值无论如何都会被保留(即,不是将x绑定(bind)到临时P2d实

c++ - 使函数内联会影响绑定(bind)到其参数的临时对象的生命周期吗?

这个问题与DoesthisC++staticanalysisrulemakesenseasis?有关,但有些不同。我现在已经实现了一个静态分析规则来查找函数返回其常量引用参数作为引用的情况,例如constX&f(constX&x){returnx;}当临时对象绑定(bind)到x时,这可能很狡猾,因为临时对象的生命周期将在f的返回值可以绑定(bind)到调用者,召集者。换句话说,这是有问题的:constX&r=f(X());在运行规则时,我在标准库中找到了min的实现,如下所示:templateinlineconst_Tp&min(const_Tp&__a,const_Tp&__b){

c++ - 进一步的右值引用和临时对象

在阐述我之前的question和question,我想了解在这个真实场景中发生了什么。我有以下模板函数:templatevoidFastHash::Insert(constKey&key,constValue&value){Insert(std::make_pair(key,value));}例如,使用左值和右值的混合调用,就像在这个调用中:std::stringname="TheGreat";hashTable.Insert(name,"Gatsby");(用于测试目的)。Insert以上调用templatevoidFastHash::Insert(pair&&keyValuePai

c++ - 确定模板中临时文件的大小

我有一个模板类需要能够在一个类型的两个实例之间进行插值。所以我的类调用一个名为interpolate的用户提供的函数,具有以下签名:templateTinterpolate(uint32_tdistance,constT&from,constT&to);此处,distance从0到0xFFFF。现在,我想为T的常见类型提供合理的实现,例如uint32_t。所以我写了一个示例实现(忽略它只为签名类型实现):templateinlineautointerpolate(uint32_tdistance,constT&from,constT&to)->std::enable_if_t::val

c++ - &&、基于范围的循环和临时变量如何协同工作?

我看到下面的代码here.描述说:Wecanalsocaptureasaforwardingreferenceusingauto&&.Thatis,auto&&willresolvetoauto&forlvaluereferences,andauto&&forrvaludreferences.Hereisanexampleofcapturingtheoutputfromarange-basedforloopoveratemporarymap.如果引用的值是左值(因此在这种情况下没有衰减),我确实理解auto&&到auto&的衰减。我苦苦挣扎的是了解临时map、基于范围的for循环和移动

c++ - 如何强制 MSVC 编译器省略大型临时对象的堆栈分配?

这个问题不是thisone的重复问题或其他类似问题。这个问题是关于在初始化和使用后清除一个结构。更新在阅读了您的前几条评论后,我想澄清一下我的问题:如何强制MSVC编译器省略大堆栈分配?我更新了标题、文本和下面的代码以阐明这一点。我最近开始使用/GS、/sdl和/analyze编译器选项编译我的项目。(MicrosoftVisualC++2015)使用这些选项,编译器可以正确警告有问题的代码结构。但是,我遇到了一些我一直认为是好的C++风格的警告。请看下面的示例代码:structmy_struct{charlarge_member[64000];};voiddo_something_e

c++ - 通过 const 引用延长临时生命周期

C++我正在尝试了解const引用如何延长临时对象的生命周期。我正在运行oneoftheanswerstoWhatarethedifferencesbetweenpointervariableandreferencevariableinC++?中的代码片段并在VC11和g++4.8之间得到了冲突的结果。我在这里扩展了代码段:#includestructscope_test{~scope_test(){printf("scope_testdone!\n");}};intmain(){constscope_test&test=scope_test();printf("inscope\n")

c++ - 短路临时生命周期

假设我们有一个短路的bool表达式,例如,f(g()&&std::string().size()==0);我正在考虑临时std::string的生命周期。通常,编译器会在完整表达式的末尾破坏临时变量。但在这种情况下,这是不合适的,因为它不知道g()是否返回true。所以我想知道编译器通常如何处理这种情况。他们是否存储了一个变量来告诉他们是否发出析构函数调用?或者标准是否允许他们提前销毁临时文件? 最佳答案 &&短路,所以std::string().size()只会在g()返回真值。IOW,如果g()没有返回true,则无需担心销毁临

c++ - 临时/"non-addressable"固定大小数组?

标题没有更好的名字,我不确定我是否能够足够清楚地解释自己。我正在寻找一种通过索引访问“数据类型”的方法,但不强制编译器将其保存在数组中。问题发生在编写基于SSE/AVX内在函数的低级代码时。为了便于编程,我想编写如下代码,在“寄存器”(数据类型__m512)上使用固定长度循环:inlinevoidload(__m512*vector,constfloat*in){for(inti=0;ivector1和vector2被定义为数组的事实对编译器来说似乎很麻烦(在我的例子中是icc):看起来被迫使其“可寻址”,将其保存在堆栈中,从而生成大量我不需要的load和store指令。据我所知,这是