Verimliliği arttırmak ve boyutu azaltmak için referans değişkenleri kullanan hiç kimse kullanmıyor mu?

Bazılarınız zaten farketmemişseniz, ben bir noob'um. Bununla birlikte, benim sorum şu:

Herhangi birinizin deneyimli programcıları, programlarınızın gerektirdiği belleği azaltmak için referans değişkenlerini kullanıyor mu? Muhtemelen tehlikeli bir uygulama olsa da, daha az bellek kullanmasını ve daha hızlı olmasını sağlamak için mobil uygulamalar için referans değişkenlerini kullanabileceğinizi düşünüyordum.

I know that in C++ when you pass a variable, as an argument, to a function that it creates a copy of that variable, but you can use the & to make it a reference variable which just points to the variables memory location. Wouldn't that make your program use less memory overall and make things faster?

1
Char (size == 4 veya 8 tipik olarak) için bir referansa karşı char (size == 1) ne demektir?
katma yazar Paul R, kaynak
İlk önceliğiniz yanlıştır - başvurular kullanılmasının bellek kullanımını azalttığını, ancak bir char by değerini geçirmenin 1 byte gerektirdiğini, buna karşın bir char'i referans alarak geçirmenin bir adres (tipik olarak 4 veya 8 bayt) gerektirdiğini ve sonradan bir referanstan bahsetmemesini önerirsiniz. değeri almak için.
katma yazar Paul R, kaynak
Bu, mimariye ve ABI'ye bağlıdır, ancak tipik değerler, kayıtlara ve/veya yığına geçirilebilir.
katma yazar Paul R, kaynak
Bunu anladığımdan emin değilim.
katma yazar JeramyRR, kaynak
Şimdi bu kısmı anladım, ama hepsi geçti. Bir değişkeni referans olarak geçirmeden program, bellekte yeni bir değişken oluşturmalıdır. Bir adres iletmek, hafızada yeni bir değişken oluşturup adresini hatırlamaktan ziyade daha fazla bellek ve işlem yapıyor mu?
katma yazar JeramyRR, kaynak

3 cevap

  1. Büyük nesneler için, struct ve object gibi bir referans daha az bellek kullanır. Bununla birlikte, çoğu kişi zaten bunları referans olarak iletmektedir, bu yüzden tartışmamız için önemli değildir.

  2. Ints ve chars gibi daha küçük şeyler bir referansla aynı boyutta veya daha küçüktür. Onları referans olarak geçirerek hafıza kazancı yok ...

  3. ... ama bir performans cezası var, çünkü değerin manipüle edilmesi için referansların kaldırılması gerekiyor.

  4. Son olarak, referans yoluyla geçmek hatalara daha sonra eğilimli olur. Programlar önce doğruluk ve ikincisi için oluşturulmalıdır.

2
katma
Harika. Aşağıdaki her şeyi kesinlikle yazmalıydım.
katma yazar iehrlich, kaynak
Teşekkür ederim. Bertaraf için bir ceza olduğunu anlayamadım. Sanırım C ++ bunu arka planda yapıyor, bu yüzden bir adım olduğunu anlayamadım.
katma yazar JeramyRR, kaynak

Bu, (a) temel mimarisi, (b) çerçeve ve (c) kullandığınız dile bağlıdır, ancak genel cevap hayır - bu en iyi (veya en yaygın) optimizasyon uygulaması değildir ve evet - yaklaşımınızı kullanarak programlar daha yavaş (çok daha yavaş!) çalışabilir.

1
katma
Referansları kullanırsanız bir programın neden çok daha yavaş çalışabileceğini tam olarak açıklayınız.
katma yazar Paul R, kaynak
@PaulR: Dediğim gibi, bazı şeylere ciddiyetle bağlı. CL veya JVM gibi bir şey olmadan x86 mimarisini dikkate alarak C veya C ++ gibi bir şey kullanarak. Bir prosedürünüz var ve ona bir wchar_t aktarmanız gerekiyor, sizeof (wchar_t) = 1 byte. Yığına değer koyarsanız, sadece 1 bayt yazmanız ve 1 bayt okumalısınız. Yığında bir referans yerleştirirseniz, 4 bayt yazmanız gerekir (sizeof (MAddr) = 4) seçeneğini göz önünde bulundurun, 4 bayt okuyun ve bu 4 bayt tarafından belirtilen adresten dolaylı bir okuma yapın.
katma yazar iehrlich, kaynak
Sonraki örnek. Konteynere bağlanan veya sınıfında yer alan sınıfın üye sınıfı örneklerini yapmak iyi bir fikir midir? Örneklemek istiyorsanız, "ClassName objactName" yaparsınız ve constructor öğesinde constructor'ı belirtirsiniz, aksi takdirde "ClassName * objectRef" yaparsınız ve "new ClassName (...)" komutunu kullanın. Cevap, derleyici için ilk seçenek daha iyidir, çünkü üyeler için derleme zamanında (örneğin, erişim sağlayıcılarını gerçekleştirdiğinde) ofsetler oluşturabilir.
katma yazar iehrlich, kaynak
Neden daha yavaş koşacaklarını açıklayabilir misin? Yeni bir değişken oluşturma adımını atlıyorsanız, bunu daha hızlı yapmaz mıydınız?
katma yazar JeramyRR, kaynak

C değişkenleri varsayılan olarak değer olarak geçirilir ve hala bir değer iletirken referansla aktarılmasında çoğu durumda hiçbir avantaj yoktur (Bu, atıfta bulunduğu değerden ziyade yalnızca işaretçi). Bayt için bir işaretçinin bayttan daha büyük olacağını unutmayın.

Diziler ve yapılar gibi daha karmaşık tiplerde C, varsayılan olarak bunları referans olarak geçirir. Herhangi bir nedenden ötürü fonksiyonun kendi kopyasına ihtiyaç duymadığı sürece, bir yapının geçmesi için bir yapının kopyasını oluşturmak yetersiz kalmaktadır. Referans olarak geçmek istiyorsanız, ancak yapınızı değiştiren fonksiyon hakkında endişeleniyorsanız, değiştirilemediğinden emin olmak için const anahtar sözcüğünü kullanabilirsiniz (veya en azından kolay değil).

0
katma