#singleton #local-variables
#singleton #локальные переменные
Вопрос:
у меня есть одноэлементный класс, при вызове одного из одноэлементных методов более одного раза за одно и то же время , и этот метод имеет локальные переменные . получает ли каждый вызов метода singleton свой собственный частный стек, нужно ли мне беспокоиться о совместном использовании / смешивании данных локальных переменных между вызовами?
Комментарии:
1. Что вы имеете в виду, вызывая его более одного раза за одно и то же время? Вы говорите о вызовах из нескольких потоков?
Ответ №1:
Использование локальных переменных в методе класса (не важно, является ли это singleton) ничем не отличается от использования локальных переменных в обычной функции. Локальные переменные не будут перепутаны.
Ответ №2:
Нет, вам не нужно беспокоиться об этом. Чтобы исправить вашу терминологию: «получает ли каждый вызов метода singleton свой собственный частный стек» — не его собственный стек, но каждый вызов метода получает свой собственный фрейм стека, так что все в порядке.
Одноэлементный метод точно такой же, как обычная функция (в C ). Подумайте о локальных переменных таким же образом.
Обратите внимание, что это не относится к статическим локальным переменным, которые специально используются совместно между вызовами методов.
Ответ №3:
Каждый метод получит свой собственный частный стек. Единственная возможность позаботиться о совместном использовании — это статические переменные внутри класса…. но поскольку класс ur является одноэлементным, это применимо и к переменным экземпляра класса ur. Локальные переменные метода всегда будут находиться в стеке freash, о них не нужно заботиться.
Комментарии:
1. Смотрите мой ответ: у каждого метода не будет своего собственного стека (у каждого потока есть свой собственный стек, но не у каждого вызова метода ). Однако у каждого вызова метода будет свой собственный фрейм стека.
Ответ №4:
Я не уверен, говорите ли вы о рекурсии или вызовах нескольких потоков, поэтому я предполагаю, что вы имеете в виду рекурсию.
При каждом вызове метода любые локальные переменные, которые не объявлены статическими, выделяются в стеке. Способ, которым это работает, заключается в том, что каждый вызов имеет свой собственный «фрейм» стека, когда вызов завершен, фрейм стека освобождается (и все локальные переменные уничтожаются).
Итак, когда вызывается функция foo(), ее локальные переменные находятся во фрейме в стеке, давайте назовем это фреймом A. Если foo вызывает сам себя, добавляется еще один фрейм, назовем его B. В течение срока действия этого второго вызова оба фрейма A и B существуют, но A по существу бездействует (обычно данные в A могут быть изменены косвенно, например, с помощью указателей). При завершении второго вызова B-фрейм освобождается, и A-фрейм снова становится активным. Наконец, когда верхний вызов завершен, фрейм A исчезает.
Поскольку объем стекового пространства ограничен, вы должны быть осторожны, чтобы не создать больше фреймов, чем может вместить стек. Если вы это сделаете, стек, как говорят, «переполняется».