我今天正在尝试编译我的项目,我之前在多个平台上编译此项目从未遇到任何问题,但在发布模式下使用g ++(4.2.1)尝试使用Mac OS X(使用-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版本的发行说明,但我找不到任何引用此特定问题的内容。另外,有没有办法标记代码段以确保它们没有优化?