Софтуерно Инженерство
Loading...
zzerro avatar zzerro 14 Точки

Референция срещу пойнтер

Здравейте!

За първа задача джъджа дава разлика в паметта и скоростта в полза на пойнтера в следните случаи:

//variant 1 use function by pointer
//Memory: 1.86 MB
//Time: 0.000 s

std::string minBy(std::vector<std::string> &values,
                  bool (*whichFn)(const std::string& , const std::string& ))
{
    sort(values.begin(), values.end(), whichFn);

    return values[0];
}

//variant 2 use function by reference
//Memory: 1.88 MB
//Time: 0.015 s

std::string minBy(std::vector<std::string> &values,
                  bool (&whichFn)(const std::string& , const std::string& ))
{
    sort(values.begin(), values.end(), whichFn);

    return values[0];
}

Има ли наистина разлика?

Тагове:
0
C++ Advanced
MartinBG avatar MartinBG 1260 Точки

На теория не би следвало да има разлика.

На практика - дори и да има, е малко вероятно да е осезаема.

При всички случаи, Judge не е надежден инструмент за измерване на памет или бързодействие и ако ни трябват реални резултати за конкретна система и компилатор, единственият начин да ги получим, е като изпълним приложението на тази система и засечем нужните ни показатели (т.е. напиши си тестове и тествай на системата си дали има разлики в скоростта/паметта).

1
04/12/2019 23:35:13
zzerro avatar zzerro 14 Точки

Аз се изненадах не толкова за разликата в скоростта, но заради паметта. Не знам как да си напиша тестове.

0
05/12/2019 23:22:52
zzerro avatar zzerro 14 Точки

Пробвам това, но винаги дава различен резултат

#include <iostream>
#define UNITS 100000000
#include<ctime>

int plus5(int x)
{
    return x + 5;
}

int minus5(int x)
{
    return x - 5;
}

int varyCalc(int x, int (*whichFn)(int))
{
    return whichFn(x);
}

int main()
{
    int *intArr = new int[UNITS];

    clock_t startTime = clock(); //time counter starts
    for(int i = 0; i < UNITS; ++i)
    {
        *(intArr+i) = varyCalc(i, plus5);
        ++i;
        *(intArr+i) = varyCalc(i, minus5);
    }

    std::cout << ((float)clock() - startTime)/CLOCKS_PER_SEC;

    std::cout << std::endl;
    system("pause");

    delete []intArr;
    return 0;
}

 

0