草庐IT

c++ - 移动构造函数似乎没有执行

这是我第一次使用C++0x右值引用进行实验,似乎发生了一些奇怪的事情。在下面的代码示例中,工厂函数MakeWindow按值返回一个Window对象。调用者使用它来初始化一个Window对象。如果我理解正确,这应该调用移动构造函数。为了检测到这一点,我在那里抛出了一个异常。最重要的是,我禁用了复制构造函数:#include//FakeWinAPItypedefvoid*HWND;HWNDCreateWindow(){return(void*)1;}voidDestroyWindow(HWND){}//EndWinAPI//C++WinAPIWrapperLibraryclassWindo

c++ - 移动构造函数似乎没有执行

这是我第一次使用C++0x右值引用进行实验,似乎发生了一些奇怪的事情。在下面的代码示例中,工厂函数MakeWindow按值返回一个Window对象。调用者使用它来初始化一个Window对象。如果我理解正确,这应该调用移动构造函数。为了检测到这一点,我在那里抛出了一个异常。最重要的是,我禁用了复制构造函数:#include//FakeWinAPItypedefvoid*HWND;HWNDCreateWindow(){return(void*)1;}voidDestroyWindow(HWND){}//EndWinAPI//C++WinAPIWrapperLibraryclassWindo

c++ - 为什么在使用结构化绑定(bind)时 auto 似乎会推断出引用?

考虑以下使用来自C++17的结构化绑定(bind)的代码:inta=0,b=0;auto[x,y]=std::tie(a,b);y=1;std::cout由于我使用了auto,我希望代码打印00因为y应该是一个拷贝。但是,它会打印01。为什么?我认为一个简单的auto永远不会推断出引用。 最佳答案 作为cppreference注意,[之前的声明部分(即auto在您的情况下)不适用于引入的标识符。相反,它适用于由编译器在幕后创建的隐藏变量。您的结构化绑定(bind)声明auto[x,y]=std::tie(a,b);大致相当于auto

c++ - 为什么在使用结构化绑定(bind)时 auto 似乎会推断出引用?

考虑以下使用来自C++17的结构化绑定(bind)的代码:inta=0,b=0;auto[x,y]=std::tie(a,b);y=1;std::cout由于我使用了auto,我希望代码打印00因为y应该是一个拷贝。但是,它会打印01。为什么?我认为一个简单的auto永远不会推断出引用。 最佳答案 作为cppreference注意,[之前的声明部分(即auto在您的情况下)不适用于引入的标识符。相反,它适用于由编译器在幕后创建的隐藏变量。您的结构化绑定(bind)声明auto[x,y]=std::tie(a,b);大致相当于auto

c++ - 将对象转换为 bool 值时,显式说明符似乎不起作用

我最近在学习C++,我注意到exampleoncppreference,其中一部分是这样的:structB{explicitB(int){}explicitoperatorbool()const{returntrue;}};intmain(){Bb2(2);//OK:direct-initializationselectsB::B(int)if(b2);//OK:B::operatorbool()}implicitconversions简介告诉我“当表达式用于if语句或循环”时,该表达式的结果(b2)将被隐式转换为bool类型。另外,explicitspecifier的介绍告诉我“转换

c++ - 将对象转换为 bool 值时,显式说明符似乎不起作用

我最近在学习C++,我注意到exampleoncppreference,其中一部分是这样的:structB{explicitB(int){}explicitoperatorbool()const{returntrue;}};intmain(){Bb2(2);//OK:direct-initializationselectsB::B(int)if(b2);//OK:B::operatorbool()}implicitconversions简介告诉我“当表达式用于if语句或循环”时,该表达式的结果(b2)将被隐式转换为bool类型。另外,explicitspecifier的介绍告诉我“转换

c++ - atoi() 和 atof() 缓存吗?它们似乎执行得越快,调用的次数越多

我使用_rdtsc()对atoi()和atof()进行计时,我注意到它们花费了很长时间。因此,我编写了自己的这些函数版本,这些版本比第一次调用要快得多。我使用的是Windows7VS2012IDE,但使用的是IntelC/C++编译器v13。我启用了-/O3和-/Ot(“喜欢快速代码”)。我的CPU是IvyBridge(移动)。经过进一步调查,似乎atoi()和atof()被调用的次数越多,它们执行得越快??我说的速度更快:当我从循环外部调用atoi()时,仅一次,它需要5,892个CPU周期,但经过数千次迭代后,这减少到300-600个CPU周期(相当大的执行时间范围)。atof()

c++ - atoi() 和 atof() 缓存吗?它们似乎执行得越快,调用的次数越多

我使用_rdtsc()对atoi()和atof()进行计时,我注意到它们花费了很长时间。因此,我编写了自己的这些函数版本,这些版本比第一次调用要快得多。我使用的是Windows7VS2012IDE,但使用的是IntelC/C++编译器v13。我启用了-/O3和-/Ot(“喜欢快速代码”)。我的CPU是IvyBridge(移动)。经过进一步调查,似乎atoi()和atof()被调用的次数越多,它们执行得越快??我说的速度更快:当我从循环外部调用atoi()时,仅一次,它需要5,892个CPU周期,但经过数千次迭代后,这减少到300-600个CPU周期(相当大的执行时间范围)。atof()

c++ - 为什么 RegCloseKey 存在(当 CloseHandle 似乎执行相同的功能时)?

我正在查看DuplicateHandle的文档前几天注意到DuplicateHandle能够复制注册表项句柄(HKEYs)。在SysInternals书中多读一点似乎表明注册表项句柄是普通的内核对象,类似于文件句柄。然而CloseHandle无法关闭HKEY和RegCloseKey不能关闭其他种类的内核对象。为什么要区分? 最佳答案 这是因为只有注册表的一部分功能是在内核中实现的。它包括使用本地注册表项的基本操作(创建、删除、读取、写入等)。其余功能在advapi32.dll中实现,工作在用户态:使用RegConnectRegist

c++ - 为什么 RegCloseKey 存在(当 CloseHandle 似乎执行相同的功能时)?

我正在查看DuplicateHandle的文档前几天注意到DuplicateHandle能够复制注册表项句柄(HKEYs)。在SysInternals书中多读一点似乎表明注册表项句柄是普通的内核对象,类似于文件句柄。然而CloseHandle无法关闭HKEY和RegCloseKey不能关闭其他种类的内核对象。为什么要区分? 最佳答案 这是因为只有注册表的一部分功能是在内核中实现的。它包括使用本地注册表项的基本操作(创建、删除、读取、写入等)。其余功能在advapi32.dll中实现,工作在用户态:使用RegConnectRegist