В одноэлементном классе (в моем случае C++), если один метод вызывается несколько раз, будут ли локальные объекты в стеке?


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

4 2

4 ответа:

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

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

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

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

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

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

При каждом вызове метода в стеке выделяются все локальные переменные, которые не объявлены статическими. Способ, которым это работает, состоит в том, что каждый вызов имеет свой собственный стек "кадр", когда вызов закончен, кадр стека освобождается (и все локальные переменные уничтожаются).

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

Так как существует ограниченное количество пространства стека, вы должны быть осторожны, чтобы не создавать больше кадров больше, чем может вместить стек. Если вы это сделаете, стек будет "переполнен".