在重载模板类的构造函数内,我有以下 for 循环。原始循环更复杂,但我删除了除
x
之外的所有变量,这些变量在调试过程中进行有用的计算,以便在较大的结构中获得最小的示例。这是目前的情况:
for (int x = 8-1; x >= 0; x--)
{
std::cout << x << "-";
if (x < 0) break;
}
当我运行此命令时,它会打印:
7-6-5-4-3-2-1-0--1--2--3--4--5--6--7--8--9--10--11-
(...)
调试器显示反汇编(ARM)为:
0x102aeef74 <+100>: mov x0, x19
0x102aeef78 <+104>: mov x1, x20
0x102aeef7c <+108>: bl 0x102bbb1f4 ; symbol stub for: std::__1::basic_ostream<char, std::__1::char_traits<char>>::operator<<(int)
0x102aeef80 <+112>: mov x1, x21
0x102aeef84 <+116>: mov w2, #0x1
0x102aeef88 <+120>: bl 0x102acfbc8 ; std::__1::__put_character_sequence[abi:v160006]<char, std::__1::char_traits<char>> at ostream:753
0x102aeef8c <+124>: sub w20, w20, #0x1
-> 0x102aeef90 <+128>: b 0x102aeef74 ; <+100> at LexPermutationPDB.h:108:13
循环条件似乎正在被优化掉。如果您从上下文中提取代码(例如,仅将循环放入 main 中),则它可以正常工作。我的猜测是,某个地方存在未定义的行为,导致优化效果不佳。
我在 MacOS Ventura 中运行 Xcode 版本 15.2 (15C500b),代码处于发布模式,即
-Os
。
添加继承自发生问题的类的新类时出现错误。新类重载单个函数并使用不同的构造函数。这个错误是在调用构造函数时发生的,但在父类已经初始化之后。
我打算尝试不同的编译器,但是对于如何追踪问题还有其他想法吗?也许新版本的编译器已经修复了某些问题。
很有道理。有符号整数不应该溢出或下溢,或者更确切地说——它是 UB。 因此,循环内的条件实际上始终为真。如果是这样,x 永远不会低于零,并且该分支也可以被消除。
考虑尝试使用 unsigned 并打破等于 0xffffffff。