Будут ли когда-нибудь совместно использоваться части кадров стека вызывающего/вызываемого объекта?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Будут ли когда-нибудь совместно использоваться части кадров стека вызывающего/вызываемого объекта?

Сообщение Anonymous »

Мне интересно, возможны ли такие сценарии для компилятора?

сначала мы определяем SomeDataType как:

Код: Выделить всё

struct SomeDataType{
public:
int a;
int b;
int c;
};
Сценарий №1_в отношении вызываемой функции, имеющей такой ссылочный параметр:

Код: Выделить всё

void doSomething(SomeDataType & input){
...
}
при условии, что функция не является встроенной и в эту функцию в программе передаются только переменные в области вызывающих функций, а также тот факт, что ссылки не обязательно являются указателями, часть памяти, в которой размещается входной аргумент, используется совместно между фреймом стека любой вызывающей функции и фреймом стека вызываемой функции «doSomething», так что «doSomething» может обращаться к этому параметру точно так же, как он обращается к любой локальной переменной в своей локальной области видимости, которая путем добавления смещения к базовый указатель, который определяет начальный адрес своего кадра стека.

Сценарий №2_Мне это кажется более невероятным, но в любом случае; относительно вызываемой функции, которая возвращает структуру типа SomeDataType:

Код: Выделить всё

SomeDataType doSomething(){
SomeDataType someStruct;
...
return someStruct;
};
часть памяти, в которой находится структура «someStruct», совместно используется кадром стека любого вызывающего объекта и кадром стека вызываемой функции «doSomething», поэтому рассмотрим следующий оператор в вызывающая функция:

Код: Выделить всё

SomeDataType TheStruct=doSomething();
в области этого вызывающего объекта использование «TheStruct» приводит к использованию той же части памяти, где находится «SomeStruct» в области вызываемого объекта, что означает, что по сути функция вызываемого абонента этого не делает. t копировать "someStruct" куда угодно, даже если копирование было необходимо, например, когда в вызывающей функции был оператор, подобный приведенному ниже, указывающий, что назначение не является структурой в области вызывающего объекта:

Код: Выделить всё

*pntrToSomewhere=doSomething();
обязанностью вызывающей стороны будет скопировать содержимое этой общей части туда, куда указывает указатель.

Подробнее здесь: https://stackoverflow.com/questions/173 ... ack-frames
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»