假设我正在用C++编写一个字符串类(我知道我可以使用该库)。字符串长度可变,存储空间在构造函数中动态分配,在析构函数中释放。当main函数调用c=a+b时(a,b,c为字符串),operator+成员函数创建一个临时对象存储连接后的字符串a+b,返回给main函数,然后operator=成员函数调用释放原先存放在c中的字符串,并将数据从临时字符串a+b复制到c,最后是临时a+b被破坏了。我想知道是否有办法实现这一点:而不是让operator=将数据从a+b复制到c,我想让它交换a+b和c的数据指针,这样当a+b被析构时,它就析构c中的原始数据(这是我们想要的),而c现在无需复制即可获取
#include#include#includeintmain(){std::stringstr1="good",str2="luck";swap(str1,str2);/*LineA*/intx=5,y=3;swap(x,y);/*LineB*/}如果我评论B行代码编译(http://www.ideone.com/hbHwf)而评论A行代码编译失败(http://www.ideone.com/odHka)我得到以下错误:error:‘swap’wasnotdeclaredinthisscope为什么我在第一种情况下没有得到任何错误? 最佳答案
我被要求在不使用临时变量或不使用xor的情况下编写交换,我想到了这个。在Java中,这是可行的,但在C/C++中,这是行不通的。我的印象是这总是有效的,因为'|'左侧的'a'的值将存储在一个寄存器中,然后对“a”的赋值将抵消对“b”的赋值的影响。inta=5;intb=-13;b=a|(0&(a=b)); 最佳答案 您正在修改一个变量并在没有插入序列点的情况下读取它的值。b=a+0*(a=b);//readinga'svaluemodifyinga这是未定义的行为。您无权对代码的作用抱有任何期望。
对于内置类型整数数组来说inta[10];inti=2;a[i]=10;或者i[a]=10;因为a[i]是*(a+i)或*(i+a)的后缀表达式,因为交换属性添加。我想为用户定义的类型实现它classDummy{//};这可能吗?如果是那么如何?如果不是,那是为什么?编辑:-我知道它很丑但是下面的代码编译:-g++-转储版本4.3.3#include#include#include#includeusingnamespacestd;intmain(){stringArrayS[10];2[ArrayS]="ADASD";cout 最佳答案
C++是否有一个内置的,例如STL的一部分来交换两个数值而不是做:inttmp=var1;var1=var2;var2=tmp;像这样:std::swapValues(var1,var2);其中swapValues是一个模板。 最佳答案 使用std::swapstd::swap(var1,var2); 关于C++内置交换两个数值?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/3
假设我们有一个二进制协议(protocol),其中的字段按网络顺序排列(大端)。structmsg1{int32a;int16b;uint32c}如果不是将网络缓冲区复制到我的msg1,然后使用“networkToHost”函数读取msg1我将msg1重新排列/反转为structmsg1{uint32cint16b;int32a;}然后简单地从网络缓冲区做一个反向复制来创建msg1。在这种情况下,不需要networkToHost函数。这种惯用的方法在大端机器上不起作用,但对我来说这不是问题。除此之外,还有其他我想念的缺点吗?谢谢附言对于以上内容,我们强制执行严格对齐(#pragmapa
我正在编写一个模板函数,它应该交换boost::mpl::vector的两个元素(类似于std::swap)。困难的部分是在编译时没有变量的概念。我已经写了一份草稿,但我想知道是否有更好的方法来解决这个问题。我当前的代码草图从迭代器中提取整数索引,并执行序列类型的拷贝并交换元素。问题是-可以做得更好吗:#include#include#include#include#include#include#include#include#include#include#includeusingboost::mpl::distance;usingboost::mpl::begin;usingbo
总结:我曾预料到std::atomic::load与std::memory_order_relaxed将接近直接加载指针的性能,至少当加载的值很少改变时。我发现原子加载的性能比VisualStudioC++2012上的正常加载差得多,所以我决定进行调查。事实证明,原子负载是作为compare-and-swap实现的。循环,我怀疑这不是最快的实现。问题:std::atomic::load有什么原因吗?需要进行比较和交换循环吗?背景:我相信MSVC++2012正在基于此测试程序对指针的原子加载执行比较和交换循环:#include#includetemplate__declspec(noin
bittwiddlinghacks网站提出以下非常有效的函数来反转位://Bitswap:reversethebitsofthevalueofunsignedintegraltypeTtemplateconstexprTbitswap(Tsrc){constexprstd::size_tchar_bit=std::numeric_limits::digits;constexprstd::size_tdigits=sizeof(T)*char_bit;std::size_tsize=digits;Tmask=~T();while((size>>=1)>0){mask^=(mask>siz
我刚找到thisanswer来自@tony-d,带有用于测试虚函数调用开销的工作台代码。我检查了是否使用g++进行基准测试:$g++-O2-ovdtvdt.cpp-lrt$./vdtvirtualdispatch:1500000000.128562switched:1500000000.0803207overheads:1500000000.0543323...我得到了比他更好的性能(比率大约为2),但后来我用clang进行了检查:$clang++-3.7-O2-ovdtvdt.cpp-lrt$./vdtvirtualdispatch:1500000000.462368switched