Daniro_San
@Daniro_San
Программист

Возможно ли в C++ повторное выделение памяти в стеке под переменную?

У меня тут вопрос по реализации стека в C++ и C# назрел.
Пример кода C#:
// Примитивный тип, очевидно
struct Example{}
// ... 
Example example=new Example(); 
// Для примитивных типов оператор new выделяет память в стеке
// Еще раз выделяем память в стеке
example=new Example();


Перейдем теперь к C++ и тому что меня волнует:

struct Example{};
//...
// Создаем переменную
Example example; // Можно Exemple example=Example(); - то же самое
// А вот и собственно вопрос - что происходит в коде ниже:
exemple=Example();

Это повторное выделение под переменную example памяти в стеке или просто присваивание в той же памяти, что была выделена ранее?
  • Вопрос задан
  • 351 просмотр
Решения вопроса 2
Adamos
@Adamos
Операция = для компилятора С++ означает "вычислить правую часть и присвоить левой результат вычисления". Что до этого было в переменной, которая была в левой части - не играет вообще никакой роли.
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
В древнем Borland C++ Builder 5
Исходный код:
struct Example {
  int a;
};

void main() {
  Example ex;
  ex.a = 1;
  ex = Example();
  ex.a = 2;
}

Трансляция в ассемблер:
@_main	proc	near
	push      ebp
	mov       ebp,esp
	add       esp,-8
	mov       dword ptr [ebp-4],1
	mov       eax,dword ptr [ebp-8]
	mov       dword ptr [ebp-4],eax
	mov       dword ptr [ebp-4],2
	mov       esp,ebp
	pop       ebp
	ret 
@_main	endp

Видно, что в начале функции в стеке было зарезервировано место под две копии структуры.
Изменим код
struct Example {
  int a;
};

void main(){
  Example ex;
  ex.a = 1;
  for (int i = 0; i < 10; i++) {
    ex = Example();
    ex.a = i;
  }
}

Ассемблер:
@_main	proc	near
	push      ebp
	mov       ebp,esp
	add       esp,-12
	mov       dword ptr [ebp-4],1
	xor       eax,eax
	mov       dword ptr [ebp-8],eax
@3: mov       edx,dword ptr [ebp-12]
	mov       dword ptr [ebp-4],edx
	mov       ecx,dword ptr [ebp-8]
	mov       dword ptr [ebp-4],ecx
	inc       dword ptr [ebp-8]
	cmp       dword ptr [ebp-8],10
	jl        short @3
	mov       esp,ebp
	pop       ebp
	ret 
@_main	endp

Опять таки, несмотря на цикл в стеке было зарезервировано место под две структуры, в цикле в переменную каждый раз копируется вторая структура.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
EvilsInterrupt
@EvilsInterrupt
System programming, Reversing Engineering, C++
Вы наверное хотите получить такое:
#include <iostream>
using namespace std;

struct Example{
	int a;
};

int main() {
	Example example{5};
	cout << example.a << endl;
	example = Example{101};
	cout << example.a << endl;
	return 0;
}


Другими словами у каждого user-defined типа есть конструкторы, деструкторы и операторы присвавания по-умолчанию.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы