Эффективный по времени способ передать указатель на макрос - PullRequest
0 голосов
/ 15 января 2020

Большая часть моего кода включает передачу адреса ячейки памяти нескольким макросам, которые выполняют необходимую работу.

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

Пример кода:

#define FILL_VAL(ptr  /* uint8_t* */  )    \
        do                                 \
        {                                  \
           /* Macro which does the job */  \
                                           \
        }while(0);

uint8_t *buf = malloc(100);
uint16_t buf_index = 0;

//Method 1:

FILL_VAL(&buf[buf_index])

//Method 2:
FILL_VAL( buf + buf_index)

Ответы [ 2 ]

0 голосов
/ 15 января 2020
  • В C ++ & buf [buf_index] является предпочтительным.
  • В C buf + buf_index это нормально.

Почему ??

В C это часть определения идиомы. «Зачем говорить вещи с большим количеством слов, чем это возможно?». Скажи это как можно короче, это облегчит понимание и затруднит ввод неправильного текста.

C ++ Введенные контейнеры. Это структуры данных, которые «выглядят» так, как они не являются. Чтобы проиллюстрировать это, рассмотрим фрагмент кода, который использует массив C фиксированного размера.

int my_vec[FIXED_SIZE]; // create elements
FILL_VAL(&my_vec);

Позже вы захотите переключиться на массив переменного размера.

std::vector<int> my_vec(FIXED_SIZE); // create a container for elements
FILL_VAL(&my_vec); // << WRONG!!!

Теперь ваш макрос "FILL_VAL" делает не то, что нужно. он будет записывать поверх фактического вектора, почти наверняка создавая неверный указатель и, в конечном итоге, повреждение памяти. Вот почему на ранних этапах использования C ++ большинство программистов перешли на этот стиль.

std::vector<int> my_vec(FIXED_SIZE); // create a container for elements
FILL_VAL(&my_vec[0]); // << Works for c-array and vector!

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

0 голосов
/ 15 января 2020

Макросы / определения - это просто текстовые замены. И как таковые, они не могут напрямую влиять на «время / пространство / любую эффективность» целевой программы.

Таким образом, в основном ваш вопрос должен быть перефразирован как «будет ли мой компилятор генерировать такой же код для (похожих) выражений, содержащих buf + buf_index и &buf[buf_index] "?

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

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