草庐IT

C++ switch 语句表达式求值保证

关于开关,标准规定如下。“当switch语句被执行时,它的条件被评估并与每个case常量进行比较。”是否意味着条件表达式只计算一次,并且每个编译器都有标准保证?例如,当一个函数用在switch语句头部时,会有副作用。intf(){...}switch(f()){case...;case...;} 最佳答案 我认为保证f只被调用一次。首先我们有Theconditionshallbeofintegraltype,enumerationtype,orclasstype.[6.4.2(1)](非积分的东西在这里不适用),和Thevalueo

c++ - new char 实际上是否保证了类类型的对齐内存?

通过newchar[sizeof(T)]分配一个缓冲区,保证为T类型分配正确对齐的内存,其中的所有成员T有它们自然的、实现定义的对齐方式(也就是说,您没有使用alignas关键字来修改它们的对齐方式)。我在这里的一些答案中看到了这个保证,但我并不完全清楚标准是如何达到这个保证的。标准的5.3.4-10给出了基本要求:本质上newchar[]必须与max_align_t对齐。我缺少的是表示alignof(T)将始终是最大值为max_align_t的有效对齐方式。我的意思是,这似乎很明显,但结构的对齐结果是否必须最多为max_align_t?甚至第3.11-3点说可能支持扩展对齐,所以编译

c++ - 函数返回值是否是自动对象并因此保证被破坏?

在[except.ctor]中,标准(N4140)保证:...destructorsareinvokedforallautomaticobjectsconstructedsincethetryblockwasentered...但是,在以下示例中,output为空。证明函数foo的返回值没有被破坏,虽然它已经被构造了。使用g++(5.2.1)和clang++(3.6.2-1)和选项-O0-fno-elide-constructors-std=c++14编译。structA{~A(){cout这是g++和clang++中的错误,还是函数返回值不是被认为是自动对象,还是C++语言中的一个漏

go - Go 是否保证地址不变?

给定一个对象obj是否有保证uintptr(unsafe.Pointer(&obj))无论何时调用,都将始终评估为相同的值?当然,Go保证如果你将两个指针指向同一个对象,它们总是会比较相等。尽管实现可能会在内存中移动一个对象并透明地更新所有指向它的指针。如果您考虑像Mark-and-Compact这样的垃圾收集策略,这会很有趣。.是否允许实现者使用这样的垃圾回收策略? 最佳答案 没有这样的保证,完全可以实现移动收集器。事实上,虽然现在垃圾收集器不会移动堆对象,但在Go1.3中,堆栈可以在需要增长时移动,所以完全有可能varobjin

linux - gettimeofday() 是否保证为微秒级分辨率?

我正在将最初为Win32API编写的游戏移植到Linux(嗯,将Win32端口的OSX端口移植到Linux)。我已经实现了QueryPerformanceCounter,方法是在进程启动后给出uSeconds:BOOLQueryPerformanceCounter(LARGE_INTEGER*performanceCount){gettimeofday(¤tTimeVal,NULL);performanceCount->QuadPart=(currentTimeVal.tv_sec-startTimeVal.tv_sec);performanceCount->QuadPar

python - False == 0 和 True == 1 是实现细节还是由语言保证?

在Python中是否保证False==0和True==1(假设它们没有被用户重新分配)?例如,是否以任何方式保证以下代码将始终产生相同的结果,无论Python的版本是什么(现有的和可能的future版本)?0==False#True1==True#True['zero','one'][False]#is'zero'任何对官方文档的引用将不胜感激!编辑:正如许多答案中所述,bool继承自int。因此,问题可以改写为:“文档是否正式说程序员可以依赖从整数继承的boolean值,具有值0和1?”。这个问题与编写不会因实现细节而失败的健壮代码有关! 最佳答案

c++ - unique_ptr 是否保证在 move 后存储 nullptr?

unique_ptr是否保证在move后存储nullptr?std::unique_ptrp1{newint{23}};std::unique_ptrp2{std::move(p1)};assert(!p1);//isthisalwaystrue? 最佳答案 可以,你可以在move之后和nullptr比较,保证比较相等。来自§20.8.1/4[unique.ptr]Additionally,ucan,uponrequest,transferownershiptoanotheruniquepointeru2.Uponcompletio

c++ - C++17 引入的评估顺序保证是什么?

在C++17evaluationorderguarantees(P0145)中投票的含义是什么?在典型的C++代码上?它对以下内容有何改变?i=1;f(i++,i)和std::cout或f(g(),h(),j()); 最佳答案 到目前为止,评估顺序未指定的一些常见情况已在C++17中指定并有效。一些未定义的行为现在是未指定的。i=1;f(i++,i)未定义,但现在未指定。具体来说,没有指定的是f的每个参数相对于其他参数的评估顺序。i++可能在i之前计算,反之亦然。事实上,它可能会以不同的顺序评估第二次调用,尽管在同一个编译器下。但是

c++ - 整数 float 除以自身是否保证为 1.f?

如果我写:intx=/*anynon-zerointegervalue*/;floaty=x;floatz=y/y;z是否保证正好是1.f? 最佳答案 如果您的C++实现使用IEEE754,那么可以,这是有保证的。(除法运算符需要返回可能的最佳浮点值)。只有y/y的异常(exception),一般来说,不是1.f的情况是y是NaN、+Inf、-Inf、0.f和-0。f,或者如果你在一个平台上int太宽以至于它的某些实例不能在没有floatfloat中表示被设置为+Inf或-Inf1。撇开最后一点,在您的情况下,这意味着intx=0;

c++ - 保证复制省略如何工作?

在2016年奥卢ISOC++标准session上,一项名为Guaranteedcopyelisionthroughsimplifiedvaluecategories的提案被标准委员会投票为C++17。保证复制省略究竟是如何工作的?它是否涵盖了一些已经允许复制省略的情况,或者是否需要更改代码以保证复制省略? 最佳答案 在许多情况下允许发生复制省略。然而,即使它被允许,代码仍然必须能够像没有删除拷贝一样工作。也就是说,必须有一个可访问的复制和/或移动构造函数。保证复制省略重新定义了许多C++概念,因此可以省略复制/移动的某些情况实际上根