Я проверяю тайминги на простой код, и я не вижу разницы. В первом блоке он действует, как только передается указатель, в случае 2 и 3 он действует как копирование его по значению не по ссылке, а всей структуре. редактировать ::: структура:Передача структуры функции C++ (эффективность)
struct e{
vector<int> a;
};
Этот код занимает 0 сек:
void ola(e &a)
{
a.a[0] = 1;
a.a[9999] = 1;
}
int main()
{
e *a;
a->a.resize(10000000, 0);
a->a[0] = 2;
a->a[99999] = 2;
ola(*a);
cout << a->a[0] << " . " << a->a[99999] << endl;
letras.resize('z' - 'a' + 1);
string entrada;
}
Это один занимает 0,15 сек:
void ola(e &a)
{
a.a[0] = 1;
a.a[9999] = 1;
}
int main()
{
e a;
a.a.resize(10000000, 0);
a.a[0] = 2;
a.a[99999] = 2;
ola(a);
cout << a.a[0] << " . " << a.a[99999] << endl;
letras.resize('z' - 'a' + 1);
string entrada;
}
Но не должно быть никакой разницы. Может быть, это потому, что в ассемблере он должен скопировать все значения структуры при прохождении его, поэтому я попытался это одно:
void ola(e *a)
{
a->a[0] = 1;
a->a[9999] = 1;
}
int main()
{
e a;
e* b;
a.a.resize(10000000, 0);
b = &a;
a.a[0] = 2;
a.a[99999] = 2;
ola(b);
cout << a.a[0] << " . " << a.a[99999] << endl;
letras.resize('z' - 'a' + 1);
string entrada;
}
На последнем я прошел только указатель на а, и он принимает 0,15sec тоже. Почему я вижу эту разницу?
1. В первом кодовом блоке 'a' неинициализирован, но вы его разыскиваете. 2. Если вы измеряете что-то как 0 секунд, вы делаете это неправильно. – MooseBoys
0 секунд означает, что это так быстро, что он говорит 0, может быть, это 0,005 с, добавлено struct info @MooseBoys –
Общий совет в таких проблемах заключается в том, что вам следует сравнить ассемблер, сгенерированный вашим компилятором. Для gcc вы можете использовать для этого флаг компиляции -S. – robal