Что стандарт C ++ гарантирует в отношении хранения, размещения локальных переменных? - PullRequest
0 голосов
/ 21 мая 2018

Давайте рассмотрим этот простой код C ++:

struct vector3d { double x, y, z; };

void foo()
{
    vector3d v;
    ...
}

Что C ++ говорит о расположении v?Мое предположение было бы: ничего, и это имело бы смысл, поскольку C ++ не должен беспокоиться о таких базовых концепциях памяти.

Но если стандарт C ++ не говорит о конкретных понятиях стека, кучи и, следовательно, динамического распределения памяти, как это гарантирует в таком случае, что компилятор не выберет перевод этой строки с базовым вызовомmalloc вместо классического sub rsp, X?

В случае, если это ничего не гарантирует, гарантирует ли C что-то (из любопытства)?Все ли разработчики C ++ считают, что это будет в стеке?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Дело в том, что локальные объекты (автоматические объекты) ДОЛЖНЫ уничтожаться в обратном порядке от их создания.Таким образом, концепция стека является неотъемлемой частью того, как стандарт ожидает, что локальные переменные будут вести себя.Он также упоминает термин «разматывание стека» при описании разрушения объекта.

Термин «стек» как общий вычислительный термин , таким образом, хорошо применяется к C++ локальным переменным.Как реализован такой «стек» и где в памяти он может находиться, можно найти, но стек - это, по сути, концепция , которая является «последним вошел - первым вышел».Именно так в стандарте C ++ говорится, что создание / уничтожение локального объекта должно происходить.

Термин «куча», хотя и не используется в стандарте, - это общий вычислительный термин , который относится именно к тому, что«свободный магазин» C ++ Standard делает.Это общая область, где могут быть получены и возвращены произвольные порции хранилища.

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

0 голосов
/ 21 мая 2018

Вы правы, что стандарт C ++ прямо ничего не говорит об этом.Действительно, такие понятия, как «стек» или «куча», не имеют смысла из POV стандарта.

Это фактически проблема качества реализации, и она отличается от гипотетического Hell ++ (девизом которого будет «придерживаться»в RAW и максимально нарушать RAI "), ни у одного компилятора нет причин хранить локальные переменные с автоматической продолжительностью в куче.

...