C++:指针和编译器(别名?)优化

标签 c++ gcc optimization

我在编译器优化方面遇到了麻烦,所以我需要一些帮助。 我有以下代码:

typedef struct {
   int32_t  DataLen;
   char     Data[1];
} MTEMSG; 
MTEMSG *IfaceData;
int Interface = MTEStructure2(ConnectionHandle, &IfaceData); 
int32_t * pointer = (int32_t *)IfaceData->Data;
ReadFromBuf(pointer);

MTEStructure2 是一个第三方函数,它分配一个以IfaceData->Data 开始并具有IfaceData->DataLen 长度的内存块。该缓冲区由多个 1 字节字符行组成,每行前面都有该行的长度(一个 4 字节整数)。所以我有一个读取一行的函数:

int * MTEGetString(int * pointer, std::string & result) 
{
    int datalen = 0;
    datalen = *pointer;
    char * data;
    data = (char *) (pointer + 1);
    result = std::string(data, datalen);
    pointer = (int *)(data + datalen);
    return pointer;
}

它是从 ReadFromBuf 中调用的,如下所示:

int* ReadFromBuf(int * pointer)
{
    std::string name="", caption="", description="";
    pointer = MTEGetString(pointer, name);
    pointer = MTEGetString(pointer, caption);
    pointer = MTEGetString(pointer, description);
    // etc
}

在 Debug模式下一切正常(我在 WinXP 下使用 Qt 5.0.1 和 gcc 4.7.2)。但是只要我切换到 Release模式,程序就会在 result = std::string(data, datalen); 上崩溃,因为 datalen(到那时整个缓冲区,我猜)是无效的。在我禁用发布版本的优化后,一切再次正常工作 (QMAKE_CXXFLAGS_RELEASE -= -O2)。

我已经阅读了一些资料,我发现最接近的是别名优化。但是即使使用 -Wall 选项,编译器也不会发出警告,而 -fno-strict-aliasing 也无济于事,所以我完全一头雾水。当然,我可以在禁用优化的情况下构建项目,但我真的很想了解发生了什么。 提前致谢。

最佳答案

经过一些研究,我发现在 gcc 调用中我同时拥有 -std=gnu++11-std=c++1x 来发布构建。在我删除 -std=gnu++11 之后,一切都运行良好。

关于C++:指针和编译器(别名?)优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20997738/

相关文章:

c++ - 如何标准化数字序列?

c++ - 在 C++ 的类构造函数中初始化结构数组

c++ - 使用进位标志的高效 128 位加法

algorithm - 将矩阵运算优化到小于 O(n^2) 的复杂度

python - 在其他数据框中找到最近的点(有很多数据)

c++ - 如何初始化对抽象类的 "bad"空引用

c++ - 在 C++ STL 中省略更大模板的类型参数

c++ - 如何在 mingw 的 gcc 中启用 iconv 支持?

c - 缺少掩码的 AVX-512 内在函数?

javascript - 如何从普通的 JavaScript 页面重定向到 Angular 6(微型网站到 Angular 6)?