Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ gcc挂起尝试使用-O2优化进行编译_C++_C_Optimization_Gcc - Fatal编程技术网

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

C++ gcc挂起尝试使用-O2优化进行编译,c++,c,optimization,gcc,C++,C,Optimization,Gcc,我今天试着编译我的项目,我以前在多个平台上编译这个项目从来没有遇到过任何问题,但是在Mac OS X上使用g++(4.2.1)在发布模式(使用-O2优化标志)下进行的尝试导致编译永远卡在同一个文件上。通过使用代码,我将问题缩小到基本上如下代码: void MyClass::SendBigMessage() { int Offset = 0; PackByteArrayIntoMessage(SomeDataArray1, SomeDataArray1Size, Offset);

我今天试着编译我的项目,我以前在多个平台上编译这个项目从来没有遇到过任何问题,但是在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++);
    }
}
我只能假设这是GCC4.2.1中的一个bug,因为在Linux上使用-O2使用GCC4.4.0进行编译可以正常工作,无需修改代码


所以我的问题是,编译器到底想做什么导致挂起问题?我查看了一些gcc版本的发行说明,但找不到任何引用此特定问题的内容。另外,是否有方法标记代码段以确保它们未被优化?

顺便问一下:您的调用包含两个参数,但函数需要三个参数。如果是错误,则可能无法转换为“更改列表”中列出的内容。这很可能是一个埋藏在编译器优化代码深处的问题。顺便说一句,使用Xcode/命令行工具发布的gcc-4.2.1既古老,又是一个特定于苹果的gcc和LLVM的组合,用胶水和字符串连接在一起。你应该考虑使用CLAN,或者最近的一个端口,比如GCC-4.81. @ Brutthal-我宁愿使用CLAN,或者你知道,一个不是6年的编译器,但是我的项目依赖于Qt4.8,而Clang没有得到官方支持,除非我移动到Qt5.1,否则很可能修复GCC 4.2.1中的bug。GCC开发人员也不再支持GCC 4.4(4.7.x是他们使用的最早版本)。因此,您陷入了两难境地——升级编译器似乎是必要的,如果这意味着升级到Qt5,那就这样吧?或者Qt5与Qt4.8之间是否存在我不知道的政治/法律问题?但是,如果它不能与编译器/代码组合一起工作,则必须进行一些更改,并且旧编译器的更改可能性比您的代码小。
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;
}