Есть ли реализация C ++ без стеков или без кучи?

C++ standard does not mention anything about the stack or the heap, they are implementation specific, что является правдой.

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

Отсюда мой вопросare there implementations of C++ that doesn't use stacks and heaps?

 Cubbi05 июн. 2012 г., 20:13
@Ira Baxter Crays использовал стеки вызовов на основе кучи, вы можете увидеть шрамы переносимости с этим в источнике многих реализацийalloca
 Steven Burnap05 июн. 2012 г., 18:18
Я использовал бессистемные версии C. Это была настоящая боль. Версия C ++ без кучи была бы возможной, но болезненной. Я не думаю, что вы могли бы обойтись без стека.
 Ira Baxter05 июн. 2012 г., 18:16
Я не знаю, как бы вы делали динамическое выделение памяти без чего-то, что фактически было кучей. Стек вызовов может быть основан на куче. Не знаю никаких реализаций.
 Ira Baxter05 июн. 2012 г., 18:21
Я построил компиляторы, которые используют размещение кучи на основе записей активации. С концептуальной точки зрения в этом нет ничего сложного или на него может повлиять C ++ (язык не имеет правил относительно «требующих стековых записей активации), поэтому я не вижу технической проблемы. Создать настоящий компилятор сложно, и, если не будет особой, сильной мотивации, вряд ли его можно будет создать.

Ответы на вопрос(7)

Решение Вопроса

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

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

 09 авг. 2018 г., 05:02
похож на MIPS. В MIPS инструкция вызова простоjal (переход и ссылка). Также нет указателя стека, вы просто используете любые регистры, чтобы указывать на область памяти и называть ее стеком. Push / Pop операции будут выполняться вручную
 08 апр. 2016 г., 03:24
Язык исполнения Google GO также делает это, чтобы избежать выделения стека в 1 МБ, они используют 4K «куча». ломти.
 21 мая 2016 г., 03:17
@JerryCoffin согласился. Ваш ответ отражает мой ответ. На этой платформе IBM они реализовалиstack с помощью специальной коллекции в куче части памяти. Это все ещеstack хоть.
 28 окт. 2014 г., 15:08
Не могли бы вы указать мне на любой ресурс, который предоставил бы некоторые технические подробности о таком & quot; без стеков & quot; Реализации IBM? Конкретная модель машины и языковая реализация, если такая информация все еще доступна где-либо.
 28 окт. 2014 г., 15:19
@AndreyT: IBM 360/370/3080 / ... - это архитектуры, о которых идет речь. У них нет регистра указателя стека. & Quot; вызов & quot; Инструкция называется BAL (ответвление и ссылка), которая хранит ваш текущий компьютер в указанном регистре, а затем переходит на указанный адрес. Вам решать, что делать дальше. В случае, если вы заботитесь, Cray 1 был почти таким же - никакой прямой аппаратной поддержки стека. На Cray люди все еще часто обращались с вещами, как с обычным стеком, но на IBM они этого не делали (по крайней мере, в компиляторах, которые я видел).

это повторяет ответ г-на Т.А. (+1 КСТАТИ). Стек и куча - это абстрактные понятия.

new а такжеdelete операторы (иmalloc а такжеfree функции) на самом деле просто интерфейс к абстракции, называемой кучей. Поэтому, когда вы просите, чтобы реализация C ++ была «без кучи», вы действительно просите, чтобы реализация не позволяла вам использовать эти интерфейсы. Я не думаю, что есть что-то, что мешает реализации постоянно отказывать этим интерфейсам.

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

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

 21 мая 2016 г., 03:07
Я бы на самом деле не согласился бы с вашим ответом "да" на кучу. Реализация на C ++ безnew/delete больше не является реализацией C ++, больше похожа на реализацию C Вы можете реализовать часть C ++, а именно функции и переменные, без выделения памяти; но это уже не C ++. Еще +1 для правильного понимания абстрактных концепций кучи и стека. Кажется, что многие люди не понимают эту концепцию.
 23 мая 2016 г., 21:44
@ Mr.TA: я больше думалnew всегда будет бросать или возвращать NULL.
 23 мая 2016 г., 23:11
Это вряд ли разница. То, что всегда терпит неудачу во время выполнения, а то, что даже не компилируется, дает тот же результат: нет C ++ :)
 24 мая 2016 г., 00:31
@ Mr.TA: это вопрос качества реализации. Программист может переопределитьnew а такжеdelete обрабатывать глобальный массив как кучу, если они хотят.
 24 мая 2016 г., 14:40
Я вижу это такnew/delete и функции являются настолько важной частью C ++, что их нельзя просто сбрасывать со счетов как «проблема качества». Это действительно определяющие части языка, а не мелкие детали, которые можно пропустить при сохранении сути языка.new это суть. И это требует кучи (какой-то).

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

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

 05 июн. 2012 г., 18:45
@JohnDibling Многие пользователи g ++ считают g ++ компилятором C ++.
 05 июн. 2012 г., 19:10
g ++ не является компилятором C ++?
 05 июн. 2012 г., 19:16
@nikhil да ,, g ++ - это то, что использует arduino. Джон утверждал, что язык не был C ++, потому что библиотеки avr не содержат новых.
 06 июн. 2012 г., 02:58
(оператор new был добавлен в arduino в версии 1.0, поэтому этот пример устарел)

Это действительно так - просто не в этих словах и без указания того, как стеки и кучи реализованы.

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

Those with static storage duration (3.7.1). These are "in-scope" for the duration of the program. Those with automatic storage duration (3.7.2). These are in scope only in the context in which they are declared. Once they fall out of scope, the variable is destroyed & deallocated. Those with dynamic storage duration (3.7.3). These are created with a new expression, and are destroyed with a delete. the objects themselves are scopeless, in the sense that their lifetime is not bound to the context in which they were newed. Immediate Pointers to these object are, of course, scoped. The pointers are of automatic or, rarely (and usually wrongly) static storage duration.

& Quot; Стек & Quot; и "куча" на самом деле именно там, где позже вторые два типа объектов живут. Это детали реализации, зависящие от платформы, которые реализуют языковые требования.

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

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

 20 мая 2016 г., 19:09
& quot; Это действительно так & quot; сопровождается несколькими параграфами о том, как это не так.
 21 мая 2016 г., 03:15
@LightnessRacesinOrbit - это то, что имел в виду Джон Диблинг, пояснив «не в этих словах» и не указав, как стеки и усилители; кучи реализованы. Стек и куча являются абстрактными понятиями, и регистр ESP и функция malloc здесь не важны.

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

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

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

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

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

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

 21 мая 2016 г., 03:12
Эта гипотетическая реализация C ++ на платформе без управления ОС и памятью и с настраиваемой «кучей»; использование статической памяти все еще делает ее «кучей»; реализация. Вы просто используете для этого очень ограниченный объем памяти. Что касается SPARC, использующего другой способ отслеживания стеков вызовов с использованием регистров, в отличие от ОЗУ, то он также все еще является стеком - просто реализован по-другому. Поэтому нет, даже в вашем специальном сценарии HW C ++ всегда использует кучу и стек, какими бы ограниченными, базовыми или необычными ни были службы ОС и регистры ЦП.

2. Stackless processors are being used now.

We don't look at cores the way assembly programmers do. We're happy with bare-bones programmer's models, so long as the required fundamentals are present. A stack is not one of them: we've run into several stackless cores recently, and have had no problems developing C compilers for them.

The eTPU is a 24-bit enhanced time processing unit, used in automotive and general aviation engine control, and process control. eTPU may be a co-processor, but it has a complete instruction set and a full CPU core, and it's stackless. It is a mid-volume processor: chances are you'll drive or fly home tonight courtesy of C on a stackless processor.

We have a C compiler for the eTPU based on C99 and ISO/IEC 18037. We run standard C test suites on this processor.

The Freescale RS08 is a more traditional MCU that is stackless. In the process of "reducing" the HC08/HCS08 core, Freescale removed the CPU stack. We consulted on the architecture of RS08, and we never felt the need to insist on a hardware stack.

To mention another co-processor we consulted on, the Freescale XGATE has a very friendly ISA and programmer's model, but it doesn't have a stack.

Then there are the "nearly stackless". Microchip PIC never had data stacking, with only an 8-entry (or 16-entry in the enhanced 14-bit core) call-return stack. Nobody doubts that C is available for PICs.

These parts, especially the eTPU, were designed to be compiler friendly and encourage machine-generated code.

There are other non-stack-based processors, some created recently, spanning a range of applications and enjoying their own C compilers. There are mid- to high-volume stackless parts. Performance is usually the primary reason that parts do not have a stack.

http://www.bytecraft.com/Stack_controversy

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

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

 05 июн. 2012 г., 18:23
Это моя точка зрения, хотя - использование кучи в качестве стека не означает, что вам не нужен стек; Вы все еще используете кучу и стек. То же самое идет в другую сторону. Куча - дурацкий способ реализовать стек, а стек - плохое место для кучи.
 05 июн. 2012 г., 18:23
Как говорит Ира Бакстер, колл 'стека' может быть основано на куче, что может рассматриваться как реализация C ++ без стеков для целей данного вопроса. Характеристики производительности будут сильно отличаться от традиционного стека выполнения.
 05 июн. 2012 г., 18:20
Вы можете уйти без кучи, как вы можете написать код безnew, Вы, конечно, потеряете большую часть стандартной библиотеки, поскольку она используетnew, Для этого вам либо нужен очень большой стек, либо вы пишете небольшие программы.
 05 июн. 2012 г., 18:23
Было бы трудно назвать язык C ++, если вы объявили вне закона "новый".
 05 июн. 2012 г., 18:22
Вызов функции не требует стека. Требуется место для хранения контекста вызывающих, а также место, где функция должна использовать пространство для локальных переменных. Кучи могут сделать это просто отлично в принципе.

Ваш ответ на вопрос