草庐IT

行为树

全部标签

c++ - 读取与忽略的不同 EOF 行为

我最近刚被std::istream::read与std::istream::ignore行为之间的细微区别绊倒了。基本上,read从输入流中提取N个字节,并将它们存储在缓冲区中。ignore函数从输入流中提取N个字节,但只是丢弃它们而不是将它们存储在缓冲区中。所以,我的理解是read和ignore在各个方面都基本相同,除了read保存提取的字节而ignore只是丢弃它们。但是read和ignore之间还有另一个微妙的区别,这让我很困惑。如果您读取到流的末尾,则不会触发EOF条件。您必须读取流的过去才能触发EOF条件。但是忽略它是不同的:您只需要读取到流的结尾。考虑:#include#i

c++ - 在运行时加载的 dll/so 中 atexit() 的行为是什么?

如果我在运行时加载一个dll/so文件(即使用LoadLibrary()或dlopen()),C++atexit的行为是什么()函数?如果我在应用程序退出之前卸载库,它会被调用吗?我可以期望在所有平台上都有相同的行为吗?(具体来说,windows和类unix系统) 最佳答案 在Windows下:当您调用FreeLibrary时,每个dll都会执行atexit函数链。重要的是要注意dll以未指定的顺序卸载,因此不要添加依赖于其他dll全局变量的atexit处理程序。这是更多信息链接:http://msdn.microsoft.com/

c++ - 使用所有寄存器后的 msvc 编译器行为

我正在尝试了解ASM概念,在观察MSVC生成的反汇编时,有一些我无法完全理解的东西。这是我的测试用例:#include#include#includeusingnamespacestd;int_tmain(intargc,_TCHAR*argv[]){intv1=1;intv2=2;intv3=3;intv4=4;intv5=5;intv6=6;intv7=7;intv8=8;intv9=9;intv10=10;intv11=11;intv12=12;intv13=13;intv14=14;intv15=15;intv16=16;intsum=v1+v2*(v3+v4*(v5+v6*(

c++ - C++11 之前的初始化列表中同一变量的多个突变是否未定义行为

考虑以下代码:intmain(){intcount=0;intarrInt[2]={count++,count++};return0;}如果我们使用clang-std=c++03编译代码,它会产生以下警告(liveexample):warning:multipleunsequencedmodificationsto'count'[-Wunsequenced]intarrInt[2]={count++,count++};^~~我不是提倡这样的代码,但类似的代码出现在另一个问题中,并且对于它是否是定义是否根据C++11之前的标准存在分歧。在C++11中,此行为是根据Aremultiplem

c++ - 访问修饰符在继承中的不同行为取决于 "this"关键字和模板或缺少它们

当涉及使用和/或省略template的4种组合时,我想了解访问修饰符关于继承的4种不同行为s和this关键词。以下所有代码均在g++4.8中完成:这是一个GrandChild类,privately继承自Parent,这privately继承自GrandParent,它有一个publicenumn.非对象,客户端代码可以访问GrandParent::n,因为后者是publicenum.但是GrandParent::n无法从内部访问GrandChild:#includeusingnamespacestd;structGrandParent{enum{n=0};};structParent:

c++ - 在 const 声明的对象上修改可变是未定义的行为吗?

我有一个消息系统,我将一个结构传递给不同的函数。在一个浓缩的例子中,一条消息是这样描述的:structMessage{boolwasHandled;Message(){wasHandled=false;}};然后像这样调用消息处理程序:handleMessage(Message());消息作为常量引用传递。我这样做的主要动机是我可以写上面的一行。如果通过非常量引用传递,我将不得不写:Messagemessage;handleMessage(message);句柄标志指示消息是否由函数处理。因此,函数handleMessage需要修改wasHandled标志。一种可能的实现方式是:voi

c++ - 与 memcpy 的数据竞争,未定义的行为?

我在一个线程中写入内存区域(使用memcpy),然后在另一个线程中使用memcpy将其复制到新位置。有时这些操作可能会重叠,从而导致数据竞争。具有数据竞争的程序会调用未定义的行为并且是无效的。在这种情况下,我在复制后检查复制的数据是否有效(实际上没有发生竞争。)如果确实发生了竞争,我将丢弃复制的数据。但是,据我所知,这并没有让我摆脱关于UB的困境。我认为是否使用数据竞赛的结果仍然是UB。现在我可以在汇编中编写自己的memcpy例程(或者只是复制并粘贴libc中的例程),这将避开整个UB问题。汇编不是C++,汇编中发生的任何事情都不会授予编译器调用鼻恶魔[1]的许可。顺便说一句,对于内联

c++ - if constexpr inside lambda, 不同的编译器行为

考虑以下代码。如果我对ifconstexpr的理解是正确的,则不应编译else分支,因此不应将z()视为错误。#includestructZ{};templatevoidf(Tz){autolam=[z](){ifconstexpr(std::is_same::value){}else{z();}};}intmain(){f(Z{});}在clang和gcc这编译;但对于最新的MSVC,它没有。不幸的是,goldbolt的MSVC太旧了,但在我的机器上完全更新了VS2017,cl/std:c++17产生了:Microsoft(R)C/C++OptimizingCompilerVersi

c++ - 使用嵌套类的奇怪 enable_if 行为(MSVC 编译器错误或功能?)

在调试我的代码一段时间后,我使用enable_if追踪到我的问题的原因是一些意外的模板特化结果:以下代码在VisualStudio2010(和2008)中的DoTest()中断言失败,而在g++3.4.5中则没有。但是,当我从SomeClass中删除模板或将my_condition移出SomeClass的范围时,它也适用于MSVC。此代码是否有问题可以解释此行为(至少部分),或者这是MSVC编译器中的错误?(使用这个示例代码,boost和c++0xSTL版本是一样的)#include#includetemplateclassSomeClass{public:templatestruct

c++ - 改变非正数除法的 python 数学模块行为

非正数除法在C++和Python编程语言中有很大不同://c++:11/3=311%3=2(-11)/3=-3(-11)%3=-211/(-3)=-311%(-3)=2(-11)/(-3)=3(-11)%(-3)=-2因此,如您所见,C++正在最小化商。然而,python的行为是这样的:#python11/3=311%3=2(-11)/3=-4(-11)%3=111/(-3)=-411%(-3)=-1(-11)/(-3)=3(-11)%(-3)=-2我不能像C++那样编写自己的除法函数,因为我将用它来检查C++计算器程序,而Python不支持中缀运算符。我可以让python在以简单的方