在osx上使用-O3的g++优化错误
g++ optimization bug on osx using -O3
下面的代码在使用-O3编译时会产生错误的退出代码。我认为内部循环被错误地优化了。与-O2或-fno-inline它工作。生成一个更简单的示例是困难的,因为任何小的更改和错误都会消失。
编制:/usr/bin/g++ -O3 -o bugexample bugexample.cpp
代码:#include <vector>
int test(std::vector<char>& a, int& b)
{
std::vector<int> z;
z.push_back(10);
z.push_back(10);
int d = (int)a.size();
int x = 1;
for (int j = 0; j < 2; j++)
{
int c = j - 1;
for (int i = 0; i < d; i++)
{
if (j == 0)
{
}
else if (i == 0)
{
}
else
{
if (a[j] == a[i - 1])
{
b = c + 1;
x = 2;
}
z[i] = 1;
}
}
}
return x;
}
int main(int argc, char* argv[])
{
std::vector<char> a;
a.push_back('a');
a.push_back('a');
int b = 1;
return test(a,b);
}
编译器版本:
/usr/bin/g++ -v
Using built-in specs.
Target: i686-apple-darwin10
Configured with: /var/tmp/gcc/gcc-5666.3~123/src/configure --disable-checking --enable-werror --prefix=/usr --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin10 --program-prefix=i686-apple-darwin10- --host=x86_64-apple-darwin10 --target=i686-apple-darwin10 --with-gxx-include-dir=/include/c++/4.2.1
Thread model: posix
gcc version 4.2.1 (Apple Inc. build 5666) (dot 3)
对任何内幕感兴趣,或者证明是我的错。
编辑:产生的退出代码是1,而它应该是2。
嗯,这是什么混淆代码比赛吗?
据我所知,你正在尝试对输入向量进行某种回文测试。,
- 循环变量
j
有2
的硬编码上界(可能应该是a.s size() ?) - 你只返回最后一个位置的检查
- 你有各种冗余条件
- 你有不必要的非常量参数
- 您有未使用的
z
矢量 - 对bool (1=>false -未找到,2=>true -已找到)使用不必要的int
- 您不必要地使用了输出参数
b
;我用b
的值替换了bool
返回类型(b==-1表示没有找到匹配)
在简化这些东西的代码时,我得到了以下代码,并且(像您自己的代码一样)它在g++ 4.6.1的所有优化级别上的行为相同:
#include <vector>
int test(const std::vector<char>& a)
{
/* int j = 1; // was: for (int j = 1; j < 2; j++) */
for (int i = a.size()-1; i > 1; i--)
if (a[1] == a[i - 1])
return 1;
return -1;
}
int main(int argc, char* argv[])
{
std::vector<char> a(2, 'a');
int b = test(a);
return b==-1? 1 : 2;
}
相关文章:
- 空基优化子对象的地址
- 关闭||运算符优化
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 返回值优化:显式移动还是隐式
- 人脸跟踪arduino代码的优化
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 纯函数,为什么没有优化
- 为什么大多数 pair 实现默认不使用压缩(空基优化)?
- 如何以优化的方式同时迭代两个间距不相等的数组
- 小字符串优化(调试与发布模式)
- 浮点定向舍入和优化
- Visual Studio 调试优化如何工作?
- 为什么开关的优化方式与 c/c++ 中的链接不同?
- 线性优化目标函数中的绝对值
- GCC 会优化内联访问器吗?
- gcc 如何优化此循环?
- 如何防止 CUDA-GDB 中的<优化输出>值
- 为什么我的程序在 O0 和 O2 的优化级别返回不同的结果
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- 使用 std::p air 进行返回值优化