草庐IT

c++ - std::string 分配何时在初始化时发生

当我在类中创建一个std::string成员变量时,是否在实例化时已经分配了默认内存?还是std::string延迟分配直到它被实际使用?我目前正在使用VisualStudio2010,我注意到,当我创建一个空字符串时:std::strings0;std::strings1="";两者都有容量==15套。那么这是否意味着它已经分配了15个字节的内存?如果是,我可以阻止这种情况以便不分配内存吗?这会是跨不同编译器的特定实现吗? 最佳答案 标准未指定空std::string的初始容量,并且取决于实现。许多实现会分配大约16个字符的初始容

c++ - 如果数据已经在缓存中,非临时存储会发生什么情况?

当您使用非临时存储时,例如movntq,并且数据已经在缓存中,存储会更新缓存而不是写出到内存吗?或者它会更新缓存行并将其写出,驱逐它吗?或者什么?这是一个有趣的难题。假设线程A正在加载包含x和y的缓存行。线程B使用NT存储写入x。线程A写入y。如果B对x的存储可以在A的加载发生时传输到内存,则这里存在数据竞争。如果A看到x的旧值,但X的写入已经发生,那么稍后写入y并最终写回缓存行将破坏不相关的值x。我假设处理器以某种方式阻止了这种情况的发生?如果允许的话,我看不出任何人如何使用NT存储构建可靠的系统。 最佳答案 在多核CPU上(即比

c++ - 如果将变量设置为新对象,旧对象会发生什么情况?

假设我们有一个类X,它没有有一个重载的operator=()函数。classX{intn;X(){n=0;}X(int_n){n=_n;}};intmain(){Xa;//(1)anobjectgetsconstructedhere//morecode...a=X(7);//(2)anotherobjectgetsconstructedhere(?)//somemorecode...a=X(12);//(3)yetanotherobjectconstructedhere(?)return0;}是否在(2)处构造了一个新对象?如果是,在(1)处构造的旧对象会发生什么情况?它是自动销毁还是

c++ - auto_ptr 会防止这种情况发生吗?

我不太清楚auto_ptr在这种情况下是否会帮助我:classA{A(constB&member):_member(B){};...constB&_member;};AgenerateA(){auto_ptrsmart(newB());AmyA(*smart);returnmyA;}当smart离开其封闭范围时,myA._member引用是否有效?如果auto_ptr不是这里的答案,那是什么?编辑:我看到我把每个人都弄糊涂了;我必须在范围外返回myA,这就是为什么我关心_member在smart退出范围后是否有效。 最佳答案 这对你

c++ - TBitBtn 和 TButton 继承链发生了什么变化?

我最近开始将我的RADStudio2007项目升级到RADStudio2009。我注意到的一件事是看似简单的代码突然无法编译。示例代码:classCButtonPopupMenu{//Snippublic:voidInit(TButton*SrcButton){SrcButton->OnClick=OnButtonClick;}private:void__fastcallOnButtonClick(TObject*Sender){//Dosomebuttonclickstuff}};//SnipTButtonbutton=newTButton(this);TBitBtnbitBtn=n

c++ - STL operator= Visual Studio 2010 的行为发生变化?

我正在尝试使用VisualStudio2010(C++)编译QtScriptGenerator(gitorious),但遇到了编译错误。在寻找解决方案的过程中,我偶尔会看到自VS2008以来由于VS2010的STL实现的变化和/或c++0x一致性变化而引入的编译破损。知道下面发生了什么,或者我该如何解决它?如果有问题的代码似乎是QtScriptGenerator的,我想我会更容易修复它。但在我看来,有问题的代码可能在VS2010的STL实现中,我可能需要创建一个解决方法?附言。我对模板和STL很陌生。我有嵌入式和控制台项目的背景,这些项目直到最近才经常被避免以减少内存消耗和交叉编译器风

c++ - 设置位是否与同一个字上的并发其他位集发生冲突?

假设我有一个位图,多个线程(在多个CPU上运行)正在其上设置位。没有使用同步,也没有原子操作。此外,不会进行任何重置。据我了解,当两个线程试图在同一个字上设置两个位时,最终只会执行一个操作。原因是要设置一个位,应该读取和写回整个字,因此当两个读取同时完成时,写回时一个操作会覆盖另一个操作。对吗?如果以上为真,那么字节操作是否也总是如此?也就是说,如果一个字是2个字节,并且每个线程都尝试将不同的字节设置为1,那么它们在并发完成时是否也会相互覆盖,或者某些系统是否支持将结果写回到一个字的一部分?问的原因是想弄清楚我必须放弃多少空间才能在位/字节/字映射操作中省略同步。

c++ - 由于在 32 位的 G++ 4.4.7 20120313 中使用 C++ std::vector 中的内联函数导致精度发生变化

我正在centos5.932位(在64位机器上运行)上编译,目标是32位。g++版本为4.4.7,这不是centos5.9上默认提供的版本,但可以使用yum下载并作为发行版的一部分提供。我有一个非常简单的循环如下std::vectorresult(n);std::vectorvalues(n);//hereIcomputevalues().TheyarecorrectandIextensivelynoted//thatthere'snothingwrongthere.Theproblemishereresult[0]=0.0;for(inti=0;i在此代码的更复杂版本中(它显示了完全

c++ - 为什么内存泄漏只发生在赋值运算符重载的情况下而不发生在复制构造函数中以及 copy-and-swap 习语如何解决它

P.S:我是编程新手,所以请用更简单的术语回答我的疑问。我找到了几个答案,但无法理解。下面是复制构造函数和赋值运算符重载。templateMystack::Mystack(constMystack&source)//copyconstructor{input=newT[source.capacity];top=source.top;capacity=source.capacity;for(inti=0;iMystack&Mystack::operator=(constMystack&source)//assignmentoperatoroverload{input=newT[sourc

java - C++中未使用的内存会发生什么

我正在经历一些练习编码问题,我遇到了一个-Implementanalgorithmtodeleteanodeinthemiddleofasinglelinkedlist,givenonlyaccesstothatnode.EXAMPLE:Input:thenode‘c’fromthelinkedlista->b->c->d->eResult:nothingisreturned,butthenewlinkedlistlookslikea->b->d->e解决办法就是简单的把下一个节点的数据复制到这个节点,然后删除下一个节点。上述解决方案将java作为编程语言牢记在心。我想知道删除节点的内