Способ, которым возвращаемое значение передается вызывающей стороне, также является частью соглашений о вызовах функций.См. здесь .
Например, относительно cdecl
:
Соглашение о вызовах cdecl
используется многими системами C для архитектуры x86.В cdecl
параметры функции помещаются в стек в порядке справа налево.Возвращаемые значения функции возвращаются в регистр EAX (за исключением значений с плавающей запятой, которые возвращаются в регистр x87 ST0).
[...]
Существуют некоторые вариации в интерпретации cdecl
, особенно в том, как возвращать значения.В результате программы x86, скомпилированные для разных платформ операционных систем и / или с помощью разных компиляторов, могут оказаться несовместимыми, даже если они обе используют соглашение cdecl
и не обращаются к базовой среде.Некоторые компиляторы возвращают простые структуры данных длиной 2 или менее регистров в EAX: EDX, а более крупные структуры и объекты классов, требующие специальной обработки обработчиком исключений (например, определенный конструктор, деструктор или присваивание), возвращаются в память.Чтобы передать «в память», вызывающая сторона выделяет память и передает указатель на нее как скрытый первый параметр;вызываемый заполняет память и возвращает указатель, возвращая скрытый указатель при возврате.
Манипуляции со стеком будут намного быстрее, чем манипуляции с кучей, необходимые при выделении памяти в куче, поэтомустек всегда быстрееЕдинственная причина (в C), вы можете захотеть вернуть указатель на что-то в куче, потому что это не помещается в стеке.
Уточнение:
В последнем предложении выше «единственная причина, по которой вы можете захотеть ...» не должна интерпретироваться как «обычно нет причин возвращать указатель».Скорее, я имею в виду «, если вы можете делать то, что вам нужно, не возвращая указатель , единственная причина, по которой вы все равно решитесь использовать указатель, это ...».веские причины для возврата указателей из функций, как Крис заявляет в своем собственном ответе, но я говорю только о тех случаях, когда вам не нужно , чтобы сделать это.
Другими словами, возврат по значению, когда вы можете;используйте указатели, когда вы должны .