我今天试图编译我的项目,我以前在多个平台上编译这个项目从来没有遇到过任何问题,但是在 Mac OS X 上使用 g++ (4.2.1) 在发布模式下尝试(使用 -O2 优化标志)导致编译永远卡在同一个文件上。玩弄代码,我将问题缩小到本质上是这段代码:
void MyClass::SendBigMessage()
{
int Offset = 0;
PackByteArrayIntoMessage(SomeDataArray1, SomeDataArray1Size, Offset);
PackByteArrayIntoMessage(SomeDataArray2, SomeDataArray2Size, Offset);
// ...snip
PackByteArrayIntoMessage(SomeDataArray9, SomeDataArray9Size, Offset);
PackByteArrayIntoMessage(SomeDataArray10, SomeDataArray10Size, Offset);
SendMessage(Message);
}
void MyClass::PackByteArrayIntoMessage(unsigned char *ByteArray, int Size, int &Offset)
{
for(int i = 0; i < Size; i++)
{
Message.SetByteAtOffset(ByteArray[i], Offset++);
}
}
注释掉正文PackByteArrayIntoMessage
意味着文件编译没有问题。此外,注释掉对 的所有调用PackByteArrayIntoMessage
,但将函数的主体保留在注释中,意味着文件编译没有问题。当我开始在对它的更多调用中发表评论时,编译时间似乎呈指数级增长,直到对它进行大约 10 次连续调用,它似乎永远挂起编译文件。
我猜 gcc 正在尝试做一些聪明的优化,所以我一直在玩,PackByteArrayIntoMessage
直到它再次开始编译,这个实现运行良好:
void MyClass::PackByteArrayIntoMessage(unsigned char *ByteArray, int Size, int &Offset)
{
for(int i = 0; i < Size; i++)
{
Message.SetByteAtOffset(ByteArray[i], Offset + i);
}
Offset = Offset + Size;
}
我只能假设这是 gcc 4.2.1 中的一个错误,因为在 Linux 上使用 -O2 编译 gcc 4.4.0 可以正常工作,无需修改代码。
所以我的问题是,编译器究竟试图做什么导致挂起问题?我查看了一些 gcc 版本的发行说明,但找不到任何引用此特定问题的内容。另外,有没有办法标记代码段以确保它们没有被优化?