Хто-небудь використовує лише змінні посилання, щоб підвищити ефективність та зменшити розмір?

Якщо хтось із вас вже не помітив, я нооб. З цим кажучи, ось моє питання:

Чи будь-який з досвідчених програмістів використовує еталонні змінні для зменшення пам'яті, необхідної для ваших програм? Я думав, що, хоча, ймовірно, це небезпечна практика, ви можете використовувати посилання для змінних для мобільних додатків, щоб вони використовували менше пам'яті та робили їх швидше.

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
Що означає символ (розмір == 1) і посилання на символ (розмір == 4 або 8 типово)?
додано Автор Paul R, джерело
Ваша початкова посилка є неправильною - ви вважаєте, що використання посилань зменшує використання пам'яті, але передавання символу за значенням вимагає 1 байта, тоді як передавання символу за посиланням вимагає адреси (зазвичай 4 або 8 байтів), не кажучи вже про подальшу де-референцію щоб отримати цінність.
додано Автор Paul R, джерело
Це залежить від архітектури та ABI, але зазвичай значення можуть бути передані в регістри та/або в стекі.
додано Автор Paul R, джерело
Я не впевнений, що розумію це.
додано Автор JeramyRR, джерело
Я отримую цю частину зараз, коли це було пояснено, але все, що тільки що минуло. Без передавання змінної в якості посилання, програма повинна створити нову змінну в пам'яті. Чи проходження адреси займає більше пам'яті та обробки, ніж створення нової змінної в пам'яті і запам'ятовування його адреси?
додано Автор JeramyRR, джерело

3 Відповіді

  1. Для великих речей, таких як структури та об'єкти, посилання використовує менше пам'яті. Проте більшість людей вже передають їх за посиланням, так що це не має значення для нашої дискусії.

  2. Менші речі, такі як ints та символи, мають однаковий розмір або менше, ніж довідник. Немає посилення пам'яті, передаючи їх посиланням ...

  3. ... але є покарання ефективності, оскільки референції потрібно відкоригувати, щоб маніпулювати цінністю.

  4. Нарешті, прохід за посиланням більше схильний до помилок, а потім прохідне значення. Програми повинні бути побудовані для правильності першого і ефективність другий.

2
додано
Чудово. Я, безумовно, повинен був написати всі матеріали нижче.
додано Автор iehrlich, джерело
Дякую. Я не зрозумів, що існує штраф за відхилення. Я думаю, C ++ робить це у фоновому режимі, тому я навіть не зрозумів, що це був крок.
додано Автор JeramyRR, джерело

Це залежить від (а) базової архітектури, (б) основи та (в) мови, яку ви використовуєте, але загальний відповідь немає - це не найкраща (або навіть звичайна) практика оптимізації та так - програми можуть працювати повільніше (набагато повільніше!), використовуючи ваш підхід.

1
додано
Будь ласка, поясніть, чому програма може працювати "набагато повільніше", якщо ви використовуєте посилання?
додано Автор Paul R, джерело
@ Паул: як я вже сказав, це серйозно залежить від деяких речей. Розглядаючи архітектуру x86 без будь-яких речей, таких як CLR або JVM, використовуйте щось на зразок C або C ++. У вас є процедура, і вам потрібно передати йому wchar_t, sizeof (wchar_t) = 1 байт. Якщо ви розмістите значення в стекі, вам просто потрібно написати 1 байт і прочитати 1 байт. Якщо ви поставите посилання на нього в стек, вам потрібно записати 4 байти (розглянути розмір (MAddr) = 4), читати 4 байти і виконувати непрямий читати з адреси, зазначеної цими 4 байтами.
додано Автор iehrlich, джерело
Наступний приклад. Чи є гарною ідеєю зробити примірники класу учасника класу, пов'язані з контейнером або інвенціонізовані в ньому? Якщо ви хочете показати, ви зробите "ClassName objactName" і вкажіть конструктор у конструкторі containter, інакше ви зробите "ClassName * objectRef" і використовуєте "new ClassName (...)". Відповідь - це перший варіант для компілятора краще, оскільки він може генерувати взаємозаліки для учасників членів у час компіляції (наприклад, коли він виконує вхідні дані).
додано Автор iehrlich, джерело
Чи можете ви пояснити, чому вони будуть працювати повільніше? Якщо ви пропускаєте крок створення нової змінної, чи не зробить це більш швидким?
додано Автор JeramyRR, джерело

В C змінні передаються за значенням за замовчуванням, і в переважній більшості випадків немає переваги при проходженні за посиланням, оскільки ви все ще передаєте значення (це лише покажчик, а не значення, на яке воно посилається). Пам'ятайте, що вказівник на байт буде більшим за байт його!

За допомогою більш складних типів, таких як масиви та структури C, вони будуть передані за посиланням за замовчуванням. Неефективно створювати копію структури для передачі в функцію, якщо функція не має певної причини необхідної власної копії структури. Якщо ви хочете пройти за посиланням, але ви стурбовані функцією зміни структури, ви можете скористатись ключовим словом const, щоб переконатися, що його неможливо змінити (або принаймні не просто).

0
додано
IT KPI C/С++ новым годом
IT KPI C/С++ новым годом
747 учасників

Чат обсуждения С/С++. - Вопросы "напишите за меня лабу" - это оффтоп. - Оффтоп, флуд, оскорбления и вбросы здесь не приняты. - За нарушение - предупреждение или mute на неделю. - За спам и рекламу - ban. Все чаты IT KPI: https://t.me/itkpi/1147