为什么指针增量语句被优化掉了
Why is a pointer increment statement optimized away?
我已经编写了一个解析GPS字符串的方法,但由于某种原因,当不使用-O0
时,关键行被优化掉了。方法代码如下:
bool Gps::ParsePMTK_ACK(PmtkAck_t &dst, uint8_t *buf, int32_t size)
{
// Verify message ID
uint8_t *pCur = buf;
memset(&dst, 0, sizeof(dst));
if (strncmp((char*)pCur, "$PMTK001", 8) != 0) {
return false;
}
pCur = pCur + 8; // <--- This line gets optimized away when not on -O0
// thus causing the pointer to NOT be incremented
if (*pCur != SEPARATOR) {
return false;
}
++pCur; // <--- Not optimized away
if (ProcessInt(dst.cmd, &pCur) != 1) {
return false;
}
int16_t tmp;
if (ProcessInt(tmp, &pCur) != 1) {
return false;
}
dst.flag = static_cast<AckFlag_t>(tmp);
return true;
} // end ParsePMTK_ACK
删除此行时,函数无法处理格式良好的消息,因为if (*pCur != SEPARATOR)
条件下的pCur==buf
。因此,函数在格式良好的消息上返回false
,因为当到达if语句时,指针指向错误的字符。
为什么优化器完全删除了指示的行?有没有更好的方法来实现,这样即使在启用优化器的情况下,我也能实现所需的行为(即,增加的指针)?
我想编译器会转换您的原始代码:
pCur = pCur + 8; // <--- This line gets optimized away when not on -O0
// thus causing the pointer to NOT be incremented
if (*pCur != SEPARATOR) {
return false;
}
++pCur; // <--- Not optimized away
变成这样:
if (*(pCur + 8) != SEPARATOR) {
return false;
}
pCur += 9;
从而在调试时造成混乱。
相关文章:
- 是否允许编译器优化掉局部易失性变量
- 具有必要副作用的静态初始化被优化掉了
- 为什么这个未使用的变量没有优化掉?
- C++对间接运算符的标准描述是否保证内存写入不会被优化掉
- 为什么这个无操作循环没有优化掉?
- (gcc)编译器是否优化掉了空体函数
- 编译器优化合并了相同的函数实现,这意味着在运行时要绕过存根
- 为什么“fork()”调用没有在无限循环中优化掉
- 一个空类会被优化掉吗
- 强制GCC不要优化掉未使用的变量
- 为什么指针增量语句被优化掉了
- sizeof()有可能被优化掉吗?
- WARN:变量不能绑定(它要么不存在,要么已经被优化掉了)
- 被管道弄糊涂了。"cat -A"似乎过滤掉了部分输出
- 静态初始化器在库中会被优化掉
- 优化掉未使用的参数化字段
- 在c++中,如果返回一个指针并立即解引用,这两个操作会被优化掉吗?
- vc++的优化打破了与NaN的比较
- 析构函数单元测试会被优化掉吗?
- c++编译器会通过“引用”优化掉未使用的返回值吗