функции управления памятью C ++ - PullRequest
4 голосов
/ 28 января 2010

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

Мои вопросы:

  1. всегда ли делаются копии параметров? Я имею в виду, даже если функция ожидает ссылку или указатель в качестве параметра, фактически создаются новые ссылки / указатели, верно? когда функция закончена, есть ли какие-нибудь деструкторы, вызванные для них?

  2. это то же самое с возвращаемыми значениями? Возвращаемое значение также копируется из контекста фактически выполняемой функции? или это просто адреса где-то и значение в контексте тоже уничтожено?

Я, вероятно, не слишком четко выразил это ... если бы вы просто объяснили, как он работает с памятью, когда вызывается какая-то функция, я был бы благодарен. У меня просто случайное представление о функции процессоров, но я уже имел дело с ассемблером, так что есть по крайней мере что-то, с чем можно работать.

Ответы [ 4 ]

6 голосов
/ 28 января 2010

C ++, как и C, является языком вызова по значению, поэтому, как правило, копии параметров всегда создаются.

Когда:

void f( int x ) {
}

вызывается, копия его параметра создается и передается функции. Когда:

* +1007 *

вызывается, копия указателя создается и передается функции.

Исключением является использование ссылок:

void f( int & x ) {
}

Копирование не производится, но внутренне (вероятно) используется указатель для передачи адреса параметра - однако вы не должны думать об этом.

Точно так же относится и к возвращаемым значениям:

int f() {
  return 1;
}

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

3 голосов
/ 28 января 2010

Ответ Нейла верен, но учтите, что компиляторы могут оптимизировать это. Это удачно называется «копирование elision». Очень хорошее объяснение этой оптимизации можно найти по следующей ссылке:

http://cpp -next.com / Архив / 2009/08 / хотите-скорость-передача по значению

1 голос
/ 28 января 2010

Вам нужно взглянуть на дискуссии в книгах / руководствах по С ++ о разнице между «вызовом по ссылке» и «вызовом по значению». Нейл отвечает правильно - по умолчанию это вызов по значению, но функция в C ++ (не C) может указать конкретный параметр - вызов по ссылке.

Также обратите внимание, что вызов по значению может привести к копированию структуры:

struct foo f(struct bar x) { ... } 
... 
struct foo myfoo;
struct bar mybar;

myfoo = f(mybar);

f () принимает структуру по значению (то есть из нее делается временная копия, обычно в стеке), а f () также возвращает другую структуру, которая копируется в mybar.

0 голосов
/ 28 января 2010
Конструктор и деструктор

вызываются при создании и уничтожении объекта соответственно, они не вызываются в случае ссылки и указателя.

В случае ссылки / указателя в качестве параметров копируется только адрес, а не данные; тогда как в случае объекта в качестве параметров фактические данные копируются (дорого в случае объекта с глубокой иерархией наследования).

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