Реального ответа на ваш вопрос нет, кроме нескольких правил, которые я склонен иметь в виду:
char - это 8 байт, а указатель - 4 байта, поэтому никогда не передавайте один символ в качестве указателя.
после того как такие вещи, как int и float имеют тот же размер, что и указатель, но на указатель необходимо ссылаться, чтобы технически это заняло больше времени
если перейти к ассемблеру Pentium I386:
загрузка значения в регистр параметра "a" в C, который является целым числом:
movl 8(%ebp),%eax
то же самое, но передается как указатель:
movl 8(%ebp),%eax
movl (%eax),%eax
Необходимость разыменования указателя требует другой операции с памятью, поэтому теоретически (не уверен, что это в реальной жизни) передача указателей длиннее ...
После проблемы с памятью. Если вы хотите эффективно кодировать весь составной тип (класс, структура, массивы ...), он должен быть передан по указателю.
Просто представьте, что выполняете рекурсивную функцию с типом 16 байтов, который передается при копировании для 1000 вызовов, что составляет 16000 байтов в стеке (вы действительно не хотите этого делать? :))
Итак, чтобы сделать его кратким и понятным: посмотрите на размер вашего типа, если он больше, чем указатель, передайте его указателем, иначе передайте его копией ...