Использование структур в функциях - PullRequest
1 голос
/ 10 августа 2011

У меня есть функция, и я часто обращаюсь к членам структуры. Что меня интересует, так это хорошая практика?

Например:

struct s
{
    int x;
    int y;
}

и я выделил память для 10 объектов этой структуры, используя malloc.

Поэтому, когда мне нужно использовать только один объект в функции, я обычно создаю (или передаю в качестве аргумента) указатель и указываю на нужный объект (мой начальник сказал мне избегать индексации массива, потому что он добавляет расчет при доступе к любому члену структуры)

Но это правильный путь? Я понимаю, что разыменование не так дорого, как создание копии, но что, если я разыменую несколько раз (например, от 20 до 30) в функции.

Было бы лучше, если бы я создал временные переменные для переменных структуры (только те, которые мне нужны, я, конечно, не использую все члены), скопировал бы значение и затем установил фактическое значение структуры перед возвратом?

Кроме того, это ненужная микрооптимизация? Обратите внимание, что это для встроенных устройств.

Ответы [ 4 ]

3 голосов
/ 10 августа 2011

Это для встроенной системы.Так что я не могу делать никаких предположений о том, что будет делать компилятор.Я не могу делать какие-либо предположения относительно размера слова, количества регистров или стоимости доступа из стека, потому что вы не сказали мне, какова архитектура.Раньше я делал встроенный код в 8080-х годах, когда они были новыми ...

ОК, что делать?

Выберите реальный фрагмент кода и закодируйте его.Закодируйте его каждым из перечисленных выше способов.Скомпилируйте это.Найдите опцию компилятора, которая вынуждает его распечатать созданный код сборки.Скомпилируйте каждый фрагмент кода с каждым различным набором параметров оптимизации.Возьмите справочное руководство по процессору и сосчитайте циклы, используемые в каждом конкретном случае.

Теперь у вас будут реальные данные для принятия решения.Реальные данные намного лучше, чем мнения миллионов опытных программистов.Сядьте со своим ведущим программистом и покажите ему код и данные.Он может хорошо показать вам лучшие способы его кодирования.Если это так, перекодируйте его по-своему, скомпилируйте и посчитайте циклы, используемые его кодом.Покажите ему, как у него получилось.

В худшем случае вы проведете выходные, изучая что-то очень важное о том, как работает ваш компилятор.Вы рассмотрели N способов кодирования вещей раз M различных наборов параметров оптимизации.Вы многое узнаете о наборе инструкций машины.Вы узнаете, насколько хорош или плох компилятор.У вас будет возможность лучше узнать своего ведущего программиста.И у вас будут реальные данные.

Реальные данные - это данные, которые вам необходимы для ответа на этот вопрос.Без этих данных никто ничего не скажет, кроме догадок, основанных на эго.Данные отвечают на вопрос.

Боб Пендлтон

2 голосов
/ 10 августа 2011

Во-первых, индексирование массива не очень дорого (только как одна операция, более дорогая, чем разыменование указателя, или иногда вообще ничего, в зависимости от ситуации).

Во-вторых, большинство компиляторов будут выполнять то, чтовызывается RVO или оптимизация возвращаемого значения при возврате структур по значению.Именно здесь вызывающая сторона выделяет пространство для возвращаемого значения вызываемой им функции и тайно передает адрес этой памяти функции, которую она будет использовать, и в результате этого копии не создаются.Он делает это автоматически, поэтому

struct mystruct blah = func();

Создает только один объект, передает его в func для прозрачного использования программисту, и копирование не требуется.

Что я не делаюзнаю, что если вы присваиваете массиву индекс возвращаемое значение функции, например:

someArray[0] = func();

, компилятор передаст адрес someArray[0] и выполнит RVO таким образом, или он просто не сделает этогооптимизация?Для этого вам понадобится более опытный программист.Я бы предположил, что компилятор достаточно умен, чтобы сделать это, но это всего лишь предположение.

И да, я бы назвал это микрооптимизацией.Но мы программисты на Си.И вот как мы катимся .

1 голос
/ 10 августа 2011

Как правило, вы хотите сделать копию переданной структуры в C, если хотите манипулировать данными на месте. То есть, ваши изменения должны быть отражены не в самой структуре, а только в возвращаемом значении. Что касается того, что дороже, это зависит от многих вещей. Многие из которых меняют реализацию на реализацию, поэтому мне нужна более конкретная информация, чтобы быть более полезной. Тем не менее, я ожидаю, что во встроенной среде объем вашей памяти выше, чем ваша вычислительная мощность. На самом деле это выглядит как ненужная микрооптимизация, ваш компилятор должен справиться с этим.

0 голосов
/ 10 августа 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...