В одноэлементном классе (в моем случае C ++), если один метод вызывается более одного раза, будут ли локальные элементы в стеке? - PullRequest
2 голосов
/ 03 июня 2011

У меня есть одноэлементный класс, при вызове одного из одноэлементных методов более одного раза в одно и то же время, и этот метод имеет локальные переменные. каждый вызов метода singleton получает свой собственный стек, мне нужно беспокоиться о совместном использовании / смешивании данных локальной переменной между вызовами?

Ответы [ 4 ]

2 голосов
/ 03 июня 2011

Использование локальных переменных в методе класса (не важно, является ли он одноэлементным) ничем не отличается от использования локальных переменных в обычной функции.Локальные переменные не будут перепутаны.

1 голос
/ 03 июня 2011

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

Каждый раз, когда вы вызываете метод, все локальные переменные, которые не объявлены как статические,размещены в стеке.Это работает так, что каждый вызов имеет свой собственный «фрейм» стека. Когда вызов завершается, фрейм стека освобождается (и все локальные переменные уничтожаются).

Поэтому, когда вызывается функция foo (), этолокальные переменные находятся в кадре в стеке, давайте назовем его кадром A. Если foo вызывает себя, добавляется еще один кадр, назовем его B. В течение жизни этого второго вызова существуют оба кадра A и B, но A по существубездействующий (обычно данные в A могут быть изменены косвенно, например, с помощью указателей).Когда второй вызов завершается, B-кадр освобождается, и A-кадр снова становится активным.Наконец, когда завершается главный вызов, фрейм A исчезает.

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

1 голос
/ 03 июня 2011

Каждый метод получает свой собственный стек.Единственная возможность позаботиться о совместном использовании - это статические переменные внутри класса .... но, поскольку ваш класс является синглтоном, он также применяется к переменным экземпляра класса ur.Локальные переменные метода всегда бывают в стеке без необходимости заботиться о них.

1 голос
/ 03 июня 2011

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

Одноэлементный метод - это то же самое, что и обычная функция (в C ++).Подумайте о локальных переменных таким же образом.

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

...