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

#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 исчезает.

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