gcc挂起尝试使用-O2优化进行编译

时间:2013-09-10 19:13:37

标签: c++ c optimization gcc

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

0 个答案:

没有答案