Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.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++ 在函数中再分配一个变量会大大增加执行时间_C++_Gcc_Memory Management_Cygwin - Fatal编程技术网

C++ 在函数中再分配一个变量会大大增加执行时间

C++ 在函数中再分配一个变量会大大增加执行时间,c++,gcc,memory-management,cygwin,C++,Gcc,Memory Management,Cygwin,我的程序出现了一些奇怪的行为。我有一个函数,在执行过程中经常被调用,当我在这个函数中只声明了一个double变量时,程序运行速度慢了10倍。以下是功能代码: void MazeWall::goSomewhere( WallInfo &caller ) { double slowDown = 0; bool possibleWays[numberOfDirections]; bool BadWays[numbe

我的程序出现了一些奇怪的行为。我有一个函数,在执行过程中经常被调用,当我在这个函数中只声明了一个
double
变量时,程序运行速度慢了10倍。以下是功能代码:

    void MazeWall::goSomewhere( WallInfo &caller )
    {   
        double slowDown = 0;

        bool possibleWays[numberOfDirections];    
        bool BadWays[numberOfDirections];
        int weightsOfDirections[numberOfDirections] = {};   
        int numOfPosWays = findPosWays( caller, possibleWays );
        int numOfBadWays = findBadWays( caller, BadWays, possibleWays );
        int selectedDir;

        if ( numOfPosWays == numOfBadWays ) // if all ways are bad
        {
            selectedDir = randomChoice( BadWays, numberOfDirections, true ); // select a bad way
        }
        else
        {
            for ( int k = 0; k < numberOfDirections; k++ )
            {
                possibleWays[k] = possibleWays[k] && (!BadWays[k] ); // leave only good ways
            }
            int step = 32 / numberOfDirections;

            // check how occupied these ways are:
            for ( int l = 0; l < numberOfDirections; ++l )
            {
                CyclicInt directionOfSight( 0, 31, 28 );

                if ( possibleWays[l] )
                {
                    directionOfSight = directionOfSight + l*step;
                    int integralDistance = 0;
                    for ( int m = 0; m <= 8; ++m )
                    {
                        integralDistance += caller.distanceToAWall32( directionOfSight, 32 );
                        directionOfSight = directionOfSight + 1;
                    }
                    weightsOfDirections[l] = integralDistance;

                }
            }
            selectedDir = weightedRandom( weightsOfDirections, numberOfDirections );
        }
        CyclicInt cyclicDir( 0, numberOfDirections - 1, selectedDir );

        caller.step( cyclicDir ); // make 1 step in selected direction
    }
void MazeWall::goSomewhere(WallInfo和caller)
{   
双减速=0;
可能的路线[方向数];
bool-BadWays[方向数];
int-weightsOfDirections[numberOfDirections]={};
int numofosways=findPosWays(调用者,可能途径);
int numobadways=findBadWays(调用者、坏道、可能通道);
int-selectedDir;
if(numofosways==numobadways)//如果所有的方法都是坏的
{
selectedDir=randomChoice(坏方法,numberOfDirections,true);//选择坏方法
}
其他的
{
对于(int k=0;k对于(int m=0;m而言,您的错误在于您没有使用优化进行编译,或者您的编译器已经过时。任何合适的编译器都会将未使用的变量从可执行文件中完全删除


我们可以根据额外的变量、更多的缓存未命中等推测内存中的
可能路径
坏路径
的对齐方式,但关键是没有优化的任何评测都没有任何意义。

在这两种情况下查看中间汇编程序代码可能是有用的。再添加一个变量可能会改变编译器使用CPU寄存器与堆栈分配变量的方式。前者显然更快。

我发现了一个愚蠢的错误,它减慢了代码的速度。我正在使用对象名作为参数实例化类的一个对象,如下所示

MyClass obj( obj );

我完全不知道为什么这样做有效,但这就是我的程序运行缓慢的原因。我猜新变量的分配会导致内存中的某些移动,从而导致随机的减速和加速。

我猜这是由于填充,请查看编译的asm代码。我敢打赌,定义该变量后,缓存将丢失更多。如果您编译w打开警告后,您将收到未使用变量的警告。在我看来,未使用变量基本上是一个逻辑错误,因此抱怨它运行缓慢是第二个问题。@spiderface adding-O2减慢了执行速度?@Brandin在调查中,如果它们确实有效,那么这个问题是好的。