4

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

4

0 回答 0