分支未在 Linux 上采用
Branch not taken on Linux
下面的代码在Windows上按预期工作,但是当使用Clang 6.0构建并在Ubuntu服务器上运行时,它不起作用。CurAnimIndex 是一个 int32,值为 2147483647(max int(。我希望它进入分支,因为增量后的 CurAnimIndex 的值应该是负数,但它不是。
CurAnimIndex++;
if (CurAnimIndex >= AnimSelectorDatas.Num() || CurAnimIndex < 0)
{
CurAnimIndex = 0;
}
0x000000000411a12f mov 0x0(%r13),%eax
0x000000000411a133 lea 0x1(%rax),%ecx
0x000000000411a136 movslq 0x10(%r13),%r15
0x000000000411a13a xor %ebp,%ebp
0x000000000411a13c cmp %r15d,%ecx
0x000000000411a13f cmovge %ebp,%ecx
0x000000000411a142 cmp $0xffffffff,%eax
0x000000000411a145 cmovl %ebp,%ecx
0x000000000411a148 mov %ecx,0x0(%r13)
0x000000000411a14c mov 0x8(%r13),%r12 enter code here
CurAnimIndex++
CurAnimIndex 是一个 int32,值为 2147483647(max int(。我希望它进入分支,因为增量后 CurAnimIndex 的值应该是负数
2147483647是一个正数。为什么你期望增加一个正数会产生一个负数?这在正常的算术中不会发生。编译器知道这一点,并根据这些知识进行优化。如果CurAnimIndex
的初始值已被证明至少为 -1,则检查CurAnimIndex < 0
始终已知为假,可以优化掉。
也许您的期望与操作溢出最大可表示值的事实有关。这种期望是错误的,因为签名溢出不能保证具有这种行为。事实上,签名溢出并不能保证具有任何特定行为。程序的行为是未定义的。
执行此操作的正确方法是首先检查该数字是否等于最大可表示值,如果不是,则仅递增。
相关文章:
- 在C++/Linux中设置单调时钟的一些技巧
- Linux的Cpp上的计时器
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 在Linux中哪里可以找到互斥、未来等的源代码
- 如何在linux终端中同时编译和运行c++代码
- 在Linux for Windows上编译C++代码时出错
- 如何找到锁定Linux futex的C++行
- IPC使用多个管道和分支进程来运行Python程序
- 在linux上调试巨大的C++项目
- 如何删除peer if else分支中的冗长句子
- 如何处理linux终端中带有负号(-)的C++中的命令行参数
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- c++方法参数只能在linux的发布模式下自行更改
- 在Linux和C++中的Windows上,散列字符串值会产生不同的输出
- 如何正确地将分支添加到已存在的树中
- 这里在 Linux 中具有"CreatePipe"和"CreateProcessW"功能吗?
- 函数在Windows或Linux上运行时表现不同
- 在Linux下捕获SIGKILL的C++程序
- 在为LINUX创建共享库时,如何避免STL的私有/弱副本
- 分支未在 Linux 上采用