Подтвердить что ты не робот

Есть ли стековая или безвыходная реализация С++?

Стандарт С++ не упоминает ничего о стеке или куче, они специфичны для реализации, что верно.

Несмотря на то, что они не являются частью стандарта С++, мы все равно используем их, настолько, что они похожи на сам язык и должны учитываться для целей памяти или производительности.

Следовательно, мой вопрос есть ли реализации С++, который не использует стеки и кучи?

4b9b3361

Ответ 1

Другие уже дали хорошие ответы о куче, поэтому я оставлю это в покое.

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

С чисто абстрактной точки зрения это, безусловно, стек - он поддерживает семантику last-in, first-out, как и любой другой стек. Вы должны смотреть на это довольно абстрактно, чтобы назвать это стеком. Если вы указали людям диаграмму блоков памяти, связанных друг с другом, я думаю, что можно надеяться, что большинство программистов будут описывать ее как связанный список. Если вы их подтолкнете, я думаю, что большинство будет судить о чем-то вроде "да, вы можете использовать его в виде стека, но это все еще связанный список".

Ответ 2

Стандарт С++ не упоминает ничего о стеке или куче

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

В С++ 03 есть три вида переменных:

  • Те, у кого статическая продолжительность хранения (3.7.1). Это "объемная область" в течение всего срока действия программы.
  • Те, у кого время автоматического хранения (3.7.2). Они представлены только в том контексте, в котором они объявлены. Как только они выпадают из сферы действия, переменная уничтожается и освобождается.
  • Те, у которых динамическая длительность хранения (3.7.3). Они создаются с выражением new и уничтожаются с помощью delete. сами объекты являются нечеткими, в том смысле, что их время жизни не связано с контекстом, в котором они были new ed. Разумеется, непосредственные указатели на этот объект охвачены областью. Указатели имеют автоматическую или, реже (и, как правило, ошибочную) статическую продолжительность хранения.

"Stack" и "Heap" - это действительно то место, где живут более поздние два типа объектов. Они представляют собой детали реализации, зависящие от платформы, которые реализуют требования к языку.

Итак, технически вы правы. В Стандарте ничего не говорится о кучах и стоках. Но он довольно много говорит о разных вкусах хранения, которые требуют какой-то реализации на реальной платформе. На большинстве современных аппаратных средств ПК это реализовано как кучи и стеки. Могут ли различные типы продолжительности хранения быть реализованы на платформе без использования кучи или стеков? Все возможно - я полагаю, что это возможно. Но какова бы ни была эта реализация, у нее, вероятно, были бы характеристики, подобные, по крайней мере, одному из двух.

В дополнение ко всему этому, существует мнение, что как автоматическая, так и динамическая длительность хранения требуется по стандарту. Любая языковая реализация, которая не соответствовала бы обоим этим требованиям, не была бы С++. Это может быть близко, но на самом деле это не С++.

Ответ 3

Для небольших сред программирования, например платформа arduino, которая была основана на микропроцессоре Atkel 8K (теперь он имеет 32K или более), куча не реализована и нет нового оператора, определенного библиотекой. Все объекты создаются статически или в стеке. Вы теряете преимущества стандартной библиотеки, но получаете возможность использовать объектно-ориентированный язык для программирования очень маленькой платформы - например, создание классов для представления контактов, настроенных как конкретные режимы вывода или последовательные порты, создание объекта этого класса давая ему номер булавки, а затем вызывая функции на этом объекте, а не пропускать номер буфера вокруг ваших подпрограмм.

Если вы используете new на arduino, ваша программа компилируется, но не связывается - компилятор g++ нацелен на набор команд avr, так что это настоящий компилятор С++. Если вы решили предоставить свою собственную реализацию, вы могли бы это сделать, но стоимость предоставления реализации на столь малой занимаемой площади не стоит выигрыша в большинстве случаев.

Ответ 4

Это, по сути, эхо-ответ г-на TA (+1 BTW). Стек и куча - абстрактные понятия.

Операторы new и deletemalloc и free) действительно являются просто интерфейсом к абстракции, называемой кучей. Итак, когда вы запрашиваете, чтобы реализация С++ была "безрадостной", вы действительно просите, чтобы реализация не позволяла вам использовать эти интерфейсы. Я не думаю, что есть что-то, препятствующее реализации всегда сбой этих интерфейсов.

Функции вызова и возобновление текущего выполнения после возврата вызова (и, при необходимости, получение возвращаемого значения) являются интерфейсами для абстракции стека. Когда вы просите, чтобы реализация С++ была "без стека", вы просите реализацию С++ запретить программе выполнять эти действия. Я не могу придумать подходящий способ для компилятора наложить это условие. Язык диктует, чтобы исходный код позволял определять функции и определять код для вызова функций.

Итак, мой ответ с точки зрения того, что возможно: "без штабеля" нет, "безрассудный" да.

Ответ 5

Не может быть реализации без стека и без кучи, поскольку С++ определяет конструкции, такие как функции и новый оператор. Для вызова функции требуется стек, а для "нового" экземпляра требуется куча. То, как они реализованы, может быть разным между платформами, но идея будет такой же. Для объектов экземпляра всегда должна быть область памяти и другая область памяти для отслеживания точки выполнения и иерархии вызовов.

Так как x86 (и x64) имеют удобные возможности для этих вещей (т.е. регистр ESP), компилятор использует это. Другие платформы могут быть разными, но конечный результат логически эквивалентен.

Ответ 6

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

Так как С++ нацелен на эффективность, реализации С++ будут использовать их. Кроме того, программа С++ обычно не работает в вакууме. Они должны интегрироваться в экосистему платформы, которая определяется платформой Application Binary Interface. ABI - по тем же причинам - определяет стек и другие структуры памяти, реализация С++ должна подчиняться.

Однако предположим, что ваша программа на С++ ориентирована на простую, небольшую, ограниченную ресурсами встроенную платформу с помощью экзотического микроконтроллера и без операционной системы (ваше приложение будет ОС!), а также без потоковой обработки или процессов.

Для начала, платформа может вообще не предоставлять динамическую память. Вам нужно будет работать с пулом статической памяти, определенным во время соединения, и разработать свой собственный менеджер распределения памяти (new). С++ позволяет это, и в некоторых средах он действительно используется.

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

Короче говоря, вся реализация С++ использует стек, большинство используют кучу, но причина сильно коррелирует с свойствами платформы.

Ответ 7

Да, есть, в основном, микроконтроллеры, такие как Freescale и PIC

2. Теперь используются стековые процессоры.

Мы не смотрим на ядра, как это делают программисты сборки. Были счастливы с моделями программистов с голой костью, если требуется основы. Стек не является одним из них: мы столкнулись с несколько бесконтактных ядер в последнее время, и не возникало проблем с разработкой C для них.

eTPU - это 24-битная усовершенствованная система обработки времени, используемая в автомобильной и управление авиационной авиацией общего назначения, а также контроль процесса. eTPU может быть сопроцессор, но он имеет полный набор команд и полный процессор ядро, и он не имеет аналогов. Это процессор среднего уровня: есть вероятность, что вы будете ехать или летать домой сегодня вечером, любезно предоставив C на безплатной процессор.

У нас есть компилятор C для eTPU на основе C99 и ISO/IEC 18037. Мы запускаем стандартные тестовые комплекты C на этом процессоре.

Freescale RS08 - это более традиционный MCU, который не содержит стекол. в процесс "сокращения" ядра HC08/HCS08, Freescale удалил процессор стек. Мы консультировались по архитектуре RS08, и мы никогда не чувствовали необходимо настаивать на аппаратном стеке.

Чтобы упомянуть о другом сопроцессоре, с которым мы консультировались, Freescale XGATE имеет очень дружественную модель ISA и программиста, но у нее нет стек.

Тогда есть "почти без штабелирования". Microchip PIC никогда не имел данных (только с 8 входами или 16-входом в улучшенном 14-битном core) call-return. Никто не сомневается, что C доступен для ПОС.

Эти части, особенно eTPU, были предназначены для компиляции дружелюбный и поощряющий машинный код.

Существуют и другие не-стековые процессоры, некоторые из которых созданы недавно, охватывая целый ряд приложений и наслаждаясь собственным C компиляторы. Есть штатные штативы средней и высокой громкости. Представление обычно является основной причиной того, что части не имеют стека.

http://www.bytecraft.com/Stack_controversy