Определенное реализацией поведение требуется быть последовательным между выполнениями в C++?

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

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

7
задан sharptooth 21 July 2010 в 05:28
поделиться

6 ответов

Определенное реализацией поведение означает

Неопределенное поведение, где каждая реализация документирует , как делается выбор

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

..... таким образом, что он различается между разными запусками одной и той же скомпилированной программы с одинаковыми входными данными?

Нет!

Например, разрешено ли реализации сказать «поведение такое в выходные дни, а в противном случае» и реализовать поведение в соответствии с таким утверждением?

Я не уверен, но думаю, что ответ будет нет .

1
ответ дан 6 December 2019 в 21:09
поделиться

Один пример, который я могу привести, это если программа использует большое или малое эндинное представление для чисел. Я считаю, что это, безусловно, считается поведением, определяемым реализацией.

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

Аналогично, я думаю, можно написать компилятор, который производит 32 и 64-битную компиляцию одной и той же программы - и режим ее выполнения может быть определен во время выполнения. Опять же, в документации должно быть написано, что ints были 32-битными или 64-битными в зависимости от того, как вы выполняли программу.

Честно говоря, я не могу представить, чтобы кто-то делал что-либо из этого, но они оба звучат смутно правдоподобными примерами того, о чем вы просили, и я не вижу причин, почему они не были бы законны по стандарту, если только документация должным образом документирует природу поведения, зависящего от системы.

3
ответ дан 6 December 2019 в 21:09
поделиться

Конечно, если реализация документирует, когда именно поведение изменяется при разных запусках, это нормально. Обратите внимание, что поведение, определяемое реализацией, является частью параметров абстрактной машины:

Семантические описания в этом международном стандарте определяют параметризованный недетерминированный абстрактный машина.

Некоторые аспекты и операции абстрактной машины описаны в этом международном стандарте как определяемые реализацией (например, sizeof (int)). Они составляют параметры абстрактной машины. Каждая реализация должна включать документацию, описывающую ее характеристики и поведение в этих отношениях. Такая документация должна определять экземпляр абстрактной машины, который соответствует этой реализации (далее именуется «соответствующий экземпляр»).

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

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

6
ответ дан 6 December 2019 в 21:09
поделиться

IIRC, system () должен существовать, но с учетом поведения, определенного реализацией. Что-то вроде system ("ls | grep foo"), естественно, будет иметь разные эффекты в зависимости от того, может ли ваша система выполнять что-то, называемое ls, которое может различаться между запусками. И даже на довольно нормальной машине UNIX, где ls и grep делают то, что вы ожидаете, и не удаляются, результат по-прежнему будет зависеть от существования файла с foo в имени, который, безусловно, будет иметь возможность варьироваться время, и откуда программа выполняется и т. д. Это просто зависит от того, где вы проводите линию «одинаковых входных данных». Если машина находится в абсолютно идентичном состоянии, вы можете ожидать идентичного поведения, но никакие два прогона не приведут к тому, что машина действительно будет в педантически идентичном состоянии. (Даже температура ЦП на совершенно идентичных машинах может привести к некоторому дросселированию, которое изменяет победителя некоторого состояния гонки, что явно приводит к другому поведению вашей программы.)

1
ответ дан 6 December 2019 в 21:09
поделиться

Гарантии - это то, что компилятор задокументировал. Различные флаги компилятора или другое состояние компьютера во время компиляции могут повлиять на то, как компилятор / оптимизатор обрабатывает вашу программу, и это может повлиять на результат.С флагами компилятора, имеющими наибольшее влияние (один и тот же компилятор может использоваться для генерации 32- и 64-битных программ в 64-битной среде, в двух прогонах требования к выравниванию могут различаться).

Можно ожидать, что в большинстве случаев разработчик предоставит некоторые базовые гарантии поведения реализации и программы, которую она генерирует для данного набора параметров компилятора / компоновщика. Даже если нагрузка на систему может повлиять на то, насколько оптимизатор может работать с вашей программой - некоторым оптимизаторам будет выделено некоторое ограниченное время, - это не должно изменить ожидаемого поведения.

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

1
ответ дан 6 December 2019 в 21:09
поделиться

rand(3) в может быть вызван из C++, не уверен, насколько библиотека C включена в "стандартный C++", но наверняка есть какой-то соответствующий стандартам механизм генерации случайных чисел.

time(3) в возвращает текущее время; та же история с C++ и вызовом в библиотеку C.

0
ответ дан 6 December 2019 в 21:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: