Essas coisas sobre "citar"

O que

Qual é a referência?
Todo mundo tem um "apelido" e um "apelido" quando são jovens, como "dogdan" e "niuniu". O efeito de chamar seu apelido pelos pais é o mesmo que chamar seu nome no livro de registro de sua casa. Na verdade , chamando seu apelido O nome é mais, você também sabe que "dogdan" e "niuniu" são você e não os outros.
Uma referência não é uma variável recém-definida, mas um apelido para uma variável existente. O compilador não abre espaço de memória para a variável de referência. Ele compartilha a mesma memória com a variável a que faz referência.
Tipo & nome da variável de referência = entidade de referência;
Insira a descrição da imagem aqui

void main()
{
    
    
	int a = 10;
	int& ra = a;
	int ar[10] = {
    
     1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int(&br)[10] = ar;
	int* p = &a;
	int*& q = p;
}

Insira a descrição da imagem aqui
Deve ser fácil entender a citação agora.
Nota:
①Não é permitida a referência nula, o que significa que a referência deve ser inicializada quando for definida
; Uma variável pode ter várias referências, como int a = 10; int & ra = a; int & rra = a; ③Uma vez que a
referência se refere a um entidade, Não há mais referências a outras entidades;
④O tipo do nome da variável referenciada e o tipo de entidade devem ser consistentes;

Quão

1. Parâmetros de passagem
Não só pode ser usado como parâmetros de função, mas a eficiência é muito maior do que as chamadas de passagem de valor.

struct Test{
    
    
	int ar[100000];
};

void fun1(Test t)//传址调用
{
    
    

}

void fun2(Test &t)//传引用
{
    
    

}
Test t;
void TestValueTime()
{
    
    
	time_t begin = clock();
	for (int i = 0; i < 10000; ++i)
		fun1(t);
	time_t end = clock();
	cout << "value time : " << end - begin << endl;
}

void TestRefTime()
{
    
    
	time_t begin = clock();
	for (int i = 0; i < 10000; ++i)
		fun2(t);
	time_t end = clock();
	cout << "ref time : " << end - begin << endl;
}

void main()
{
    
    
	TestValueTime();
	TestRefTime();
}

Insira a descrição da imagem aqui
Percebe-se que a eficiência da passagem por referência é maior do que a passagem por valor, se a estrutura for mais complexa, a eficiência é maior.
↑ porque?
Porque quando um valor é usado como um parâmetro ou tipo de valor de retorno, a função não passará diretamente o parâmetro real ou retornará a própria variável diretamente durante a passagem e o retorno do parâmetro. Em vez disso, a passagem do parâmetro real retornará uma cópia temporária da variável , então o valor é usado Como um parâmetro ou tipo de valor de retorno, a eficiência não é alta.
Em segundo lugar, retorne o valor
Primeiro, dê a diferença entre o retorno da função comum e o retorno de referência:
Insira a descrição da imagem aqui
comparação de eficiência

struct Test{
    
    
	int ar[100000];
};
Test t;
Test fun1()
{
    
    
	return t;
}

Test& fun2()
{
    
    
	return t;
}
void TestValueTime()
{
    
    
	time_t begin = clock();
	for (int i = 0; i < 10000; ++i)
		fun1();
	time_t end = clock();
	cout << "value time : " << end - begin << endl;
}

void TestRefTime()
{
    
    
	time_t begin = clock();
	for (int i = 0; i < 10000; ++i)
		fun2();
	time_t end = clock();
	cout << "ref time : " << end - begin << endl;
}

int main()
{
    
    
	TestValueTime();
	TestRefTime();
	return 0;
}

Insira a descrição da imagem aqui
Resumindo: se você usar uma referência como parâmetro ou valor de retorno, a eficiência será melhorada.

A diferença entre referência e ponteiro

Em termos de conceito gramatical, as referências são apelidos, não há espaço independente e compartilham um espaço com as entidades a que se referem;
na verdade , espaço para a implementação subjacente (da perspectiva da montagem), porque as referências são implementadas da maneira de ponteiros. (Eu não entendo esta frase muito bem)
Olhe para o código:
Insira a descrição da imagem aqui
verifique o código do assembly:
Insira a descrição da imagem aqui
a diferença entre uma referência e um ponteiro:
quando uma referência é definida, ela deve ser inicializada e um ponteiro não é necessário;
após fazer referência a um entidade, nenhuma outra entidade pode ser referenciada, e o ponteiro pode estar em qualquer Ao apontar para o mesmo tipo de entidade; não
pode ser uma referência nula, mas há um ponteiro nulo; em
sizeof, a referência é o tamanho do referenciado tipo de entidade. O ponteiro ocupa 4 bytes em um sistema de 32 bits e 8 bytes em um sistema de 64 bits;
Auto-adição de referência significa que a entidade de referência é incrementada em um, e a auto-adição do ponteiro é deslocada para trás em um tipo tamanho;
a referência de vários níveis não é permitida, mas há ponteiros de vários níveis; a
referência é mais segura.

Obrigado pessoal por pisar nisso!

Acho que você gosta

Origin blog.csdn.net/qq_43560037/article/details/114670040
Recomendado
Clasificación