Перейти к содержанию
    

Как лучше передавать аргументы в функцию: по значению или по указателю

3 minutes ago, haker_fox said:

Хорошо. А как быть с Майерсом? Им почему-то любят щеголять... Применим он при программировании для встраиваемых сиситем?

А я не знаю: я его книги не читал. Взглянул сейчас - есть книга и по embedded у него. Но, чтобы сказать, полезно или нет - надо читать.

Изменено пользователем one_eight_seven

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, haker_fox сказал:

Но он говорит, что "Майерс больше заслуживает мнения".

Забавны такие люди, однозначно. Зависимые на 100% от каких-то Майерсов, а не от своей головы =)

Заявлять о каких-то специфичных вещах, зависимых от конкретной архитектуры (а также ABI, и даже, скорее всего, продвинутости оптимизатора), обобщая их и подводя под одно святое правило, чистой воды пердеж в лужу:spiteful:

 

P.S. Лично я стараюсь не вступать в дискуссии с коллегами, когда видно, что "Майерсы" это первый (и, видимо, последний) аргумент против железных пруфов по любой тематике))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, haker_fox сказал:

откуда эта связь, что если ссылка, то обязательно нужно адрес загрузить? Вернее, с точки зрения компилятора, почему такое отличие ссылки от передачи по значению?

Хорошая статья про ссылки и указатели. В чем похожи и чем отличаются.

А рекомендация Мейерса - это, по сути, перефразированная: используйте передачу по ссылке (указателю) для больших объектов, а по значению - для малых. Т.к. ссылка на объект, размером от регистра ядра и менее будет работать не быстрее, чем передача его по значению. Т.е. выгоды для малых объектов от передачи их в функцию по ссылке/указателю не будет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

20 minutes ago, Arlleex said:

Забавны такие люди, однозначно. Зависимые на 100% от каких-то Майерсов, а не от своей головы =)

Заявлять о каких-то специфичных вещах, зависимых от конкретной архитектуры (а также ABI, и даже, скорее всего, продвинутости оптимизатора), обобщая их и подводя под одно святое правило, чистой воды пердеж в лужу:spiteful:

 

P.S. Лично я стараюсь не вступать в дискуссии с коллегами, когда видно, что "Майерсы" это первый (и, видимо, последний) аргумент против железных пруфов по любой тематике))

Полностью поддерживаю.

Когда в голове пусто, то и Майерсы не помогут.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, haker_fox сказал:

Хорошо. А как быть с Майерсом? Им почему-то любят щеголять... Применим он при программировании для встраиваемых сиситем?

Майерс очень хорошо понимает, как устроены плюсы. Поэтому почитать его весьма полезно. Понятное дело, что в случае встраиваемых систем может быть своя специфика, и её надо учитывать. Но в целом, с Майерсом ваш код будет лучше, чем без :-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, Arlleex сказал:

Смотреть ABI соглашения о вызовах для конкретной архитектуры и исходя из этого принимать решение.

Вот имхо самый правильный тезис - кратко и достоверно. Ключ именно в calling convention. Как можно что-то "универсальное" утверждать, если соглашений о вызове даже в рамках одного компилятора может быть несколько. И соглашения о вызовах к стандарту C отношения не имеют афаик. Поэтому у каждой архитектуры, каждого компилятора - свои варианты могут быть. Конечно на деле их не так много и все придерживаются примерно одного. Но никто не заставляет вроде...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

52 минуты назад, NStorm сказал:

Ключ именно в calling convention. Как можно что-то "универсальное" утверждать, если соглашений о вызове даже в рамках одного компилятора может быть несколько.

Вы можете привести/придумать пример соглашения о вызовах, при котором структуру в 100 байт выгоднее передавать по значению, чем по ссылке?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Легко - на архитектуре с 800-битными регистрами. ) Ну кто сказал, что речь о реальном железе? Также как никто и не говорил о 100-байтных структурах до этого.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 минут назад, NStorm сказал:

Легко - на архитектуре с 800-битными регистрами. ) Ну кто сказал, что речь о реальном железе? Также как никто и не говорил о 100-байтных структурах до этого.

Даже на такой архитектуре не будет выгоднее. Максимум - вровень.

А про то, что ответ на вопрос "как лучше передавать аргументы в функцию" зависит от размера аргументов как раз уже несколько человек высказались. В том числе и некий Скотт Мейерс.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А почему говорится только о "передавать", а не об "использовать" в функции? Если аргумент в регистре, с ним работа эффективнее, чем вызывать его по адресу каждый раз, сколько понадобится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, ViKo said:

а не об "использовать" в функции?

Это подразумевалось.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 hours ago, haker_fox said:

 Экономя стэк и машинное время. Это актуально для прерываний, например.

Лучше это быстрее?  Для небольших ембедед приложений? А если ничего не передавать, а использовать глобальные переменные или просто макросы, когда размер кода не критичен....

Я в таких случаях делал и ассемблерные вставки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, Serhiy_UA said:

а использовать глобальные переменные или просто макросы, когда размер кода не критичен....

Глобальные переменные не рекомендуется использвать из соображений безопасности, читаемости и надёжности кода.

Макросы стараемся уже давно заменить на inline функции и шаблоны. В си++ им не место.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, ViKo сказал:

Если аргумент в регистре, с ним работа эффективнее, чем вызывать его по адресу каждый раз, сколько понадобится

Если аргумент не имеет квалификатора volatile, то ничего не мешает любому вменяемому оптимизатору внутри функции перед первым использованием загрузить его в регистр и в дальнейшем использовать оттуда. Оптимизаторы в сях с плюсами вполне вменяемые, так что "каждый раз" ну никак не будет в реальной жизни. Автор темы тоже вполне вменяемый человек и заподозрить его в отключении оптимизатора было бы глупо. Более того, если аргумент был передан в регистре - компилятор вполне может положить его на стек, если регистр вдруг понадобится для вызова вложенной функции и уже переданный в регистре аргумент будет вызываться "по адресу".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, Сергей Борщ said:

Если аргумент не имеет квалификатора volatile, то ничего не мешает любому вменяемому оптимизатору внутри функции перед первым использованием загрузить его в регистр и в дальнейшем использовать оттуда.

Уф! Бальзам на душу!) Просто сколько раз пытаюсь некоторым коллегам на работе объяснить, что цитировать только Майерса нельзя. Нужно учитывать и архитектуру, и возможности компилятора. И, считаю, что нельзя просто так брать, и копировать подходы с "большого брата" на мир встраиваемых систем. Но когда я предлагаю им поизучать регистры процессора, как там вообще всё устроено, на меня смотрят большими глазками и чуть ли не крутят пальцем у виска...РРРР!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...