草庐IT

c++ - 共享内存和写时复制或右值引用和移动语义?

通用容器(如Qt容器中的那种)的共享内存/写时复制实现是否被C++11移动语义和右值引用所取代?哪里失败了,哪里成功了?或者它们是互补的而不是替代品? 最佳答案 写入时复制和移动语义都已用于优化将数据保存在堆上的对象的值语义。例如,std::string已被实现为写时复制对象和支持移动的对象。因此写时复制和移动语义在这方面是相似的:如果您对“复制”的定义足够松散,它们都可以用于优化“复制”。我有时将移动语义描述为写时复制,引用计数被限制为0或1,因此包含引用计数的字段被优化掉了。std::lib中的所有容器现在都使用移动语义,甚至以

c++ - 传递给函数时限制数组的大小

当作为参数传递给函数时,是否可以限制数组的大小?我的意思是像这样可能吗?/*followingwillleadtocompiletimeerror*/template=20>//ortemplatevoidfunc(T(&a)[n]){//dosomethingwitha}我希望我的数组的大小至少(或最多)n(n可以有任何值)。例如:当n=20时,我必须传递一个至少(或最多)20个元素的数组。在C++中有什么方法可以做到这一点吗? 最佳答案 您可以简单地将需求设为静态断言-例如使用Boosts静态断言:templatevoidfun

c++ - (避免)C++ 中的复制机制

这个问题在这里已经有了答案:关闭11年前。PossibleDuplicate:Whycopyconstructorandassignmentoperatoraredisallowed?我正在从扎实的C背景中学习C++,为了避免我从reddit和黑客新闻中收集到的以前C++的错误,我一直在使用GoogleC++styleguide和LLVM的源代码作为我自己代码的引用。突出的一件事是两个项目都使用了以下代码。以下内容摘自LLVM的include/Support/MemoryBuffer.h:MemoryBuffer(constMemoryBuffer&);//DONOTIMPLEMENT

c++ - STL 中的写时复制支持

我刚刚在读aWikipediaarticleonCopy-on-write(很好奇有没有文件系统支持),被下面这段话惊到了:COWisalsousedoutsidethekernel,inlibrary,applicationandsystemcode.ThestringclassprovidedbytheC++standardlibrary,forexample,wasspecificallydesignedtoallowcopy-on-writeimplementations:std::stringx("Hello");std::stringy=x;//xandyusethesam

c++ - 返回时复制操作是在 lock_guard 析构函数之前还是之后执行的?

这个问题在这里已经有了答案:C++returnvaluecreatedbeforeorafterautovardestruction?(2个答案)inC++whichhappensfirst,thecopyofareturnobjectorlocalobject'sdestructors?[duplicate](4个答案)关闭4年前。get_a()函数对于竞争条件是否安全,或者我是否需要像在get_b()中那样显式复制str_以便按顺序有一个线程安全的功能?classClass{public:autoget_a()->std::string{auto&&guard=std::lock_

c++ - 创建新线程时复制构造函数调用

我正在阅读《C++并发实战》一书,以了解有关线程和C++内存模块的更多信息。我很好奇复制构造函数在以下代码中被调用的次数:structfunc{func()=default;func(constfunc&_f){}voidoperator()(){}};intmain(){funcf;std::threadt{f};t.join();return0;}当我在VisualStudio2013调试器中遍历这段代码时,我看到复制构造函数被调用了四次。它从主线程调用了三次,然后从新线程调用了一次。我期待一个,因为它为新线程制作了对象的拷贝。为什么要创建三个额外的拷贝?

c++ - 在 clang 中强制使用 `const char[]` 字符串文字

编译以下代码voidf(char*,constchar*,...){}voidf(constchar*,...){}intmain(){f("a","b");}用clang给我这个错误:prog.cpp:6:2:error:callto'f'isambiguousf("a","b");^prog.cpp:1:6:note:candidatefunctionvoidf(char*,constchar*,...){}^prog.cpp:2:6:note:candidatefunctionvoidf(constchar*,...){}^AFAIK字符串字面量在C++中是常量,因此重载规则应该

c++ - 如何在库中强制包含 "unused"对象定义

我的问题与这些类似,但似乎并不完全相关:Howtoforceinclusionofanobjectfileinastaticlibrarywhenlinkingintoexecutable?ForcingsymbolexportwithMSVC我得到的是这样的:structthingy;structcontainer{staticcontainer&instance();//singletonintregister_thingy(thingy*);};structthingy{virtual~thingy(){}virtualintid()const=0;};//templatetri

c++ - 在 MSVC 中强制未对齐的位域打包

我有一个加起来为48位的位域结构。在GCC上,这会正确地生成一个6字节的结构,但在MSVC中,该结构会出现8个字节。我需要找到一些方法来强制MSVC正确打包结构,既为了互操作性,也因为它在内存关键环境中使用。下面看到的结构由三个15位数字、一个2位数字和一个1位符号组成。15+15+15+2+1=48,所以理论上它应该能装进六个字节,对吧?structS{unsignedshorta:15;unsignedshortb:15;unsignedshortc:15;unsignedshortd:2;unsignedshorte:1;};但是,在GCC和MSVC上编译它会导致sizeof(S

linux - 如何在 Windows git 沙箱中强制 LF 用于特定文件?

我的项目的一个第三方构建步骤要求在XML配置文件中使用LF行结尾,无论构建是在Windows、Mac还是Linux上进行。为了方便起见,我们的git沙箱在Windows上使用CRLF,在Mac/Linux上使用LF,我们的存储库是LF。我需要只有这个文件才能在任何地方都是LF。我怎样才能做到这一点? 最佳答案 你或许可以使用.gitattributes文件来设置该文件的行尾:yourfilename.txttexteol=lf 关于linux-如何在Windowsgit沙箱中强制LF用于