相关疑难解决方法(0)

如果我优化大小而不是速度,为什么GCC会生成15-20%的代码?

我在2009年首先注意到GCC(至少在我的项目和我的机器上)如果我优化尺寸(-Os)而不是速度(-O2-O3),则会产生明显更快的代码,我一直想知道为什么.

我设法创建(相当愚蠢)代码,显示这种令人惊讶的行为,并且足够小,无法在此处发布.

const int LOOP_BOUND = 200000000;

__attribute__((noinline))
static int add(const int& x, const int& y) {
    return x + y;
}

__attribute__((noinline))
static int work(int xval, int yval) {
    int sum(0);
    for (int i=0; i<LOOP_BOUND; ++i) {
        int x(xval+sum);
        int y(yval+sum);
        int z = add(x, y);
        sum += z;
    }
    return sum;
}

int main(int , char* argv[]) {
    int result = work(*argv[1], *argv[2]);
    return result;
}
Run Code Online (Sandbox Code Playgroud)

如果我用-Os它编译它,执行这个程序需要0.38秒,如果用-O2 …

c++ performance gcc x86-64 compiler-optimization

430
推荐指数
6
解决办法
9万
查看次数

难以衡量C/C++性能

我写了一段C代码,以展示关于优化和分支预测的讨论中的一点.然后我注意到比我预期的更多样化的结果.我的目标是用C++和C之间通用子集的语言编写它,这对于两种语言都是标准兼容的并且相当便携.它在不同的Windows PC上进行了测试:

#include <stdio.h>
#include <time.h>

/// @return - time difference between start and stop in milliseconds
int ms_elapsed( clock_t start, clock_t stop )
{
    return (int)( 1000.0 * ( stop - start ) / CLOCKS_PER_SEC );
}

int const Billion = 1000000000;
/// & with numbers up to Billion gives 0, 0, 2, 2 repeating pattern 
int const Pattern_0_0_2_2 = 0x40000002; 

/// @return - half of Billion  
int unpredictableIfs()
{
    int sum = 0;
    for ( int i = …
Run Code Online (Sandbox Code Playgroud)

c c++ optimization performance measurement

12
推荐指数
1
解决办法
1945
查看次数

警告"解除引用类型 - 惩罚指针会破坏严格别名规则"的结果

我对类似主题和与之相关的一些材料进行了一些查询.但我的查询主要是了解下面代码的警告.我不想修复!! 我知道有两种方法,一个联合或使用memcpy.

uint32 localval;
void * DataPtr;
localval = something;
(*(float32*)(DataPtr))= (*(const float32*)((const void*)(&localval)));
Run Code Online (Sandbox Code Playgroud)

请注意以下重点
1.这里涉及的两种类型都是32位.(或者我错了吗?)
2.两者都是局部变量.

编译器具体要点:
1.代码应该是平台无关的,这是一个要求!!
我在GCC编译,它按预期工作.(我可以将int重新解释为浮点数),这就是为什么我忽略了警告.

我的问题
1.编译器在此别名情况下可以执行哪些优化?
2.因为两者都会占用相同的大小(如果不是,请纠正我)这样的编译器优化的副作用是什么?
3.我可以安全地忽略警告或关闭别名吗?
4.如果编译器没有执行优化,我的程序在第一次编译后没有被破坏?我可以安全地假设每次编译器的行为方式都相同(不进行优化)吗?
5.别名是否也适用于void*类型转换?或者它是否仅适用于标准类型转换(int,float等...)?
6.如果禁用别名规则会有什么影响?

编辑
1.基于R和Matt McNabb的更正
2.增加了一个新问题

c casting strict-aliasing compiler-optimization pointer-aliasing

5
推荐指数
1
解决办法
590
查看次数

模板类型为基础时通过引用传递的成本

我一直听说确保最佳表现的良好做法是:

  • 按值传递基本类型(int,double...)
  • 通过const引用传递类

现在,在编译器下使用C++ 11和完全优化,当通过const引用传递基本类型时是否有开销?

进而,当Tint将以下功能:

template <typename T> inline void f(const T& x);
Run Code Online (Sandbox Code Playgroud)

慢于:

template <typename T> inline void f(const T x);
Run Code Online (Sandbox Code Playgroud)

c++ optimization pass-by-reference pass-by-value c++11

4
推荐指数
1
解决办法
622
查看次数