Pull to refresh
4
0
Дмитрий Алексеев@deviant_9

Пользователь

Send message
Например вижу ошибку выхода за границу массива

То есть вы ещё не перешли на utf-8?
Как это относится к теме более строго контроля типов?

Приведу пример. Допустим, есть у нас некая функция, которая по каким-то причинам (крайне устаревший код, некомпетентность автора, потенциальное наличие заведомо нереализуемых в данной ситуации особых вариантов поведения и т. д.) принимает параметр типа char*, а не const char*, но аргумент свой, как мы точно знаем, не модифицирует:
int f(char *str);
А нам нужно вызвать её из другой функции, передав аргумент типа const char*. Приходится использовать const_cast:
int g(const char *str, int x)
{
    return x + f(const_cast<char*>(str));
}

Если человек на фоне недосыпа вместо этого случайно написал
int g(const char *str, int x)
{
    return x + f(const_cast<char*>(x));
}
то компилятор ему об этом скажет: const_cast<char*>(x) — невалидная конструкция.

Но в языке Си мы вынуждены использовать cast notation (ничего другого нет) — там аналогичная функция
int g(const char *str, int x)
{
    return x + f((char*)x);
}
с точки зрения компилятора будет полностью валидной.

В одном случае контроль типов сработал, в другом — нет.
В любом случае, «созвездие» С++-style casts позволяет вам сделать все, что угодно (не говоря уже о том, что C-style cast никто в С++ не запрещал).

В любом случае ремни безопасности можно не пристёгивать.

Если у человека есть _цель_ отстрелить себе ногу, то C++-style casts ему действительно ничем не помогут. Но контроль типов — это немного про другое.
Таки имеют.

5.1.1.3 Diagnostics
A conforming implementation shall produce at least one
diagnostic message (identified in an implementation-defined
manner) if a preprocessing translation unit or translation
unit contains a violation of any syntax rule or constraint...

В сноске:
...Of course, an implementation is free to produce any
number of diagnostics as long as a valid program is still
correctly translated. It may also successfully translate
an invalid program.

Warning — одна из реализаций «diagnostic message». А успешная компиляция программы допускается даже если последняя некорректна.
В качестве доказательства приводится тот факт, что чей-то уютненький компилерчик выдает на это «всего лишь warning».

Понятно, что к реальности такие заявления никакого отношения не имеют.

Как минимум, gcc (не такой уж и уютненький, вполне себе серьёзный, по строгой поддержке стандарта в том числе) по умолчанию ведёт себя именно так. Можно и const сбрасывать, и вообще совершенно разные объектные типы неявно приводить друг к другу — будет только предупреждение, а при компиляции C++-программ — ошибка.

Diagnostic message есть — формально требование Стандарта со стороны компилятора соблюдено.
Явные касты же — не по теме. Явные касты — это средства обхода контроля типов.

Так обходить по-разному можно. (T)v значит вообще практически все проверки выключить, в то время как специализированные касты отключают лишь некоторые проверки (например, static_cast и reinterpret_cast не позволят ненароком сбросить const).
вместо int, short, long и long long ввести int<«N»>где «N»-гарантированное минимальное число бит в платформозависимом типе;


Во-первых, гарантии там и так есть (исходя из <limits.h>):
  • char, signed char, unsigned char — не меньше 8 бит;
  • short, unsigned short, int, unsigned int — не меньше 16 бит;
  • long, unsigned long — не меньше 32 бит;
  • long long, unsigned long long (since C99) — не меньше 64 бит.


Во-вторых, начиная с C99 есть <stdint.h> с его [u]int_least&ltN&gt_t и [u]int_fast&ltN&gt_t (соответственно «самые маленькие» и «самые быстрые» типы с минимальной заданной битностью).

Вместо int8_t, int16_t и т.д. — ввести похожую конструкцию, но с чётко фиксированным размером в битах.


У них-то как раз фиксированные размеры — ровно столько значащих бит, сколько указано. Более того, для них гарантируется также:
  • отсутствие битов-заполнителей;
  • кодирование при помощи двоичного дополнительного кода (в то время как для остальных знаковых типов допускается любая pure binary system — как минимум прямой код и обратный код, а не только двоичный дополнительный).

Нефиксированным остаётся лишь порядок байтов.

Если платформозависимый размер int еще оправдан


На практике он, как ни странно, оказался относительно платформонезависимым — 32 бита что на 32-битных, что на 64-битных платформах:) В отличие от long, который (в беззнаковом варианте), например, в ядре Linux используется чуть ли не как синоним void*.
Ещё перечисления (преобразующиеся к целочисленным типам, но не обратно), особенно появившиеся в C++11 scoped enumerations (к которым и целочисленные типы не преобразуются).

Явное приведение типов (которое в cast notation преобразует практически что угодно к чему угодно) разбито на static_cast, const_cast и reinterpret_cast (а также имеющий смысл только для C++ dynamic_cast).

Объектно-ориентированным программированием на Си тоже занимаются, реализуя наследование вложением одних структур в другие. Отсутствие встроенных для этого средств приводит к использованию грязных хаков, со статическим контролем типов при этом всё совсем плохо. Например, в Glib Object System такие функции, как g_object_ref/g_object_unref/g_object_new принимают/возвращают просто void*, чтобы не приходилось явно приводить типы; в gtk функции создания виджетов возвращают GtkWidget* (указатель на базовый класс всех виджетов, а не на конкретный класс виджета), и т. д.
В ядре активно используются gcc-шные расширения, но «объектно-ориентированные» фишки реализуются вполне себе штатными средствами чистого Си. Никакого особого «Си с классами» там нет:)
Добавлю ещё, что для стандартных типов тоже есть определённые гарантии (если уж мы вынуждены писать на с89), следующие из описания хедера <limits.h>:
  • char, signed char, unsigned char — не меньше 8 бит (в точности — CHAR_BIT бит), нет битов-заполнителей;
  • short, unsigned short — не меньше 16 значащих бит;
  • int, unsigned int — не меньше 16 значащих бит;
  • long, unsigned long — не меньше 32 значащих бит;
  • long long, unsigned long long — не меньше 64 значащих бит (но эти типы появились лишь в C99).
То есть sizeof(int) == 4 еще не означает что int равен четырем байтам


Тут два момента.

С одной стороны, означает:
The sizeof operator yields the size (in bytes) of its operand, which may be an expression or the parenthesized name of a type.


С другой стороны, стандарт Си описывает всё в терминах абстрактной машины, не привязываясь ни к каким свойствам реальных машин. В Си своя модель памяти, которая не обязана сколько-нибудь явно соответствовать организации памяти той реальной среды, в которой программа будет выполняться (собственно, и не соответствует: компиляторы одни переменные помещают в регистры, другие полностью выкидывают, переупорядочивают операции чтения/записи и т. д.). Поэтому и понятие «байт» в стандарте Си, строго говоря, не обязано совпадать с понятием байта в «железе».
Третий вопрос полностью о темных углах. Начиная с того, что ни переполнения integer


Переполнение возникнет лишь если результат умножения не помещается в int.

Преобразование между целочисленными типами данных (в данном случае от int к char) — немного другая статья. Если результирующий тип — беззнаковый, то гарантируется модулярная арифметика по модулю 2^<число бит>; в противном случае результат будет implementation-defined (в поздних стандартах на этот случай появилась фраза "...or an implementation-defined signal is raised", но это всё равно не undefined behavior).

Более того, размер типа char в битах не определен. Существовали платформы где он был по 6 бит (помните триграфы?) и существуют платформы где все пять целочисленных типов по 32 бита.


Стандарт требует, чтобы CHAR_BIT был не меньше 8 бит.
Те же самые круги можно и на шаре нарисовать:)

Проще это только тем, что не вызывает вопросов про четвёртое измерение.

> чуть проще понять почему есть «горизонт» — после определенного количества таких кругов скорость «прироста пространства» становится равной скорости света, а потом становится больше чем скорость света

На всякий случай отмечу, что положение горизонта определяется всей будущей динамикой расширения Вселенной. Лишь в пустой плоской Вселенной с ненулевым лямбда-членом его положение определяется просто приравниванием скорости удаления к скорости света.
> Да, это писал подразумевая, что скорость расширения не уменьшается. Потому что сейчас считается именно так.

Смотря что понимать под «скоростью расширения» — производную масштабного фактора или H. Первая увеличивается, вторая уменьшается.

> Почему Н должна уменьшаться из-за снижения средней плотности материи?

Честно говоря, сам уже не могу понять, с чего мне это пришло в голову…

Тем не менее, при нулевой/пренебрежимой кривизне пространства (что для нашей Вселенной имеет место) связь между плотностью материи и H (по одному из уравнений Фридмана, учитывая, что H=(da/dt)/a и полагая k=0) именно такая:
H^2 = (8πGρ + Λc^2)/3
Чем меньше ρ, тем меньше H. Хотя причинную связь тут, конечно, бессмысленно усматривать — просто и ρ, и H уменьшаются.

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

Это от начальных условий зависит. Если Вселенная при Большом Взрыве получила не слишком большой «импульс», то H будет сначала убывать (пока материя доминирует), а потом асимптотически возрастать (при ещё меньшем «импульсе» Вселенная сколлапсирует обратно). При этом кривизна пространства положительная и не слишком маленькая. Если начальный «импульс» был очень большим, то и H вначале будет большой, асимптотически убывая; кривизна пространства при этом отрицательная.

Но при плоском пространстве (а значит, и в нашей Вселенной), как следует из уравнения Фридмана, повторюсь, всё же будет именно асимптотическое убывание H.
Митохондриальный геном маленький, испытывает сильное воздействие активных форм кислорода и плохо ремонтируется.

Тогда уж лучше в Y-хромосому.
> эти галактики удаляются от нас со скоростью уже выше скорости света, т.е. их достичь невозможно в принципе(только наблюдать за ними).

Возможность достичь объект не связана напрямую с тем, удаляется он от нас со скоростью большей или меньшей c в _данный_ момент. Скорость удаления ведь может уменьшаться с течением времени, в том числе рано или поздно став меньшей c.

Полагая тёмную энергию лямбда-членом можно сказать, что принципиально достижимые нами объекты сейчас удаляются от нас со скоростью, несколько большей c (ибо H уменьшается из-за уменьшения плотности всей остальной материи).

А без тёмной энергии достижима была бы вообще вся Вселенная, даже при вечном расширении (то есть при плотности меньше критической), независимо от скорости удаления (которая, по закону Хаббла, может быть сколь угодно большой).
Величина 1/H по порядку величины равна возрасту Вселенной (была бы точно равна, если бы расширение за всё время существования Вселенной не замедлялось и не ускорялось, то есть если бы масштабный фактор зависел от времени линейно). В далёком будущем, впрочем, это соотношение не будет иметь место.

Как конкретно возраст Вселенной считают/считали — не знаю)

Значение H в конкретный момент времени характеризует исключительно скорость расширения (в этот момент), а не ускорение. Другое дело, если известно что-то о динамике этой величины за некоторый период — её можно узнать, например, измеряя красное смещение (и, каким-нибудь независимым образом, расстояние — например, по светимости) до объектов, в разной степени удалённых от нас (для «неподвижных» источника и приёмника красное смещение z означает, что с момента испускания сигнала до момента его получения Вселенная расширилась в 1+z раз). Ускорение расширения Вселенной было открыто при наблюдении очень далёких сверхновых.
> постоянная Хаббла растет

Она может расти лишь если тёмная энергия — фантомная энергия.

Если же тёмная энергия — лямбда-член (пограничный между фантомной энергией и квинтэссенцией вариант, до сих пор согласующийся с наблюдениями), то постоянная Хаббла может лишь асимптотически убывать до некоторого ненулевого значения (если бы была _только_ тёмная энергия, H была бы неизменной).

Когда говорят про «ускоренное расширение», имеется в виду рост величины da/dt (a — масштабный фактор, то есть, грубо говоря, расстояние между двумя «неподвижными» галактиками), то есть что d^2(a)/dt^2>0. Постоянная Хаббла же H=(da/dt)/a расти при этом не обязана — скорость увеличения расстояния между галактиками может увеличиваться просто за счёт увеличения расстояния между ними, даже если H уменьшается (не слишком быстро).

> тем не менее, центром пересечения всех векторов ускорений этих объектов мы не являемся.

Во-первых, если рассматривать ситуацию во фридмановской СК и пренебрегать пекулярными скоростями, то ускорения этих объектов равны нулю:) Ибо их удаление в такой СК обусловлено расширением самого пространства, а не их движением в пространстве.

Во-вторых, если локально выбрать СК, в которой пространство не расширяется и которая всё ещё оставляет равноправными все направления в той точке, где мы находимся, то мы таки являемся центром пересечения всех векторов ускорений. Другое дело, что этот трюк можно с равным успехом проделать в любой точке пространства, наше положение в этом плане ничем не выделено (переход от одной точки к другой — переход в ускоренную СО, вектора ускорений при этом меняются, как и точка их пересечения).
В однородной Вселенной давление не может оказывать «механического» влияния на её динамику.

Скажем, на Земле мы все испытываем атмосферное давление, но оно нас никуда не «расталкивает». Но у атмосферного давления есть небольшой вертикальный градиент (с высотой давление падает) — благодаря этому градиенту на все тела таки действуют сила, направленная вверх (архимедова сила), против градиента давления, позволяющая наполненным гелием шарикам взмывать ввысь. Но в масштабах Вселенной давление всюду однородно, градиента (и, следовательно, силы) нет.

На примере звёзд — каждая звезда получает излучение от других звёзд равномерно со всех сторон, так что излучение её никуда не выталкивает. (Да и масштабы не те.)

Ускорение/замедление расширения Вселенной полностью определяется гравитацией. Почему гравитационные силы, в отличие от сил давления (включая давление излучения звёзд), не уравновешиваются, несмотря на однородность — в двух словах не сказать; можете посмотреть мои комментарии к предыдущим выпускам Итана, где я описывал ньютоновскую модель расширения Вселенной. Дело в том, что однородность с гравитацией имеет место лишь при учёте принципа эквивалентности, при рассмотрении переходов в ускоренные СО; в каждой же конкретной СО всегда есть центр масс, притягивающий к себе все остальные объекты. (В ОТО, конечно, гравитация не является силой, и рассматривается обычно система координат, где не тела разлетаются, а само пространство расширяется; но в целом суть та же.)

В ОТО давление, наряду с плотностью энергии, тоже является источником гравитации, так что влияние на расширение оно оказывает — но не такое, как можно было бы интуитивно ожидать: положительное давление замедляет расширение. Так что излучение звёзд никак не может способствовать ускоренному расширению (у излучения давление положительное). Наоборот, оно объясняется _отрицательным_ давлением тёмной энергии.
Второй закон термодинамики говорит, что энтропия Вселенной не может убывать. Но каким образом из этого должна следовать неизбежность нагрева всего и вся до температуры реликтового излучения? Да и что вообще под этим понимать, учитывая, что по мере расширения Вселенной реликтовое излучение будет асимптотически охлаждаться до абсолютного нуля (если расширение будет продолжаться вечно)?

Если тёмная энергия — это лямбда-член, что рано или поздно Вселенная расширится настолько, что практически все частицы будут изолированы друг от друга (в смысле, потеряют возможность даже обмена световыми сигналами), то есть теплообмен для них прекратится. Фотоны будут охлаждаться обратно пропорционально масштабному фактору, массивные же частицы (когда они станут нерелятивистскими) — обратно пропорционально квадрату масштабного фактора.

То есть материя не просто будет холоднее реликтового излучения: отношение их температур будет стремиться к бесконечности (хоть разность и будет стремиться к нулю, так как они обе стремятся к нулю).

Насчёт Бумеранга и 2.7К не знаю — считать надо.
> Скоростью света ограничена только относительная скорость перемещения двух тел/излучений, в данный конкретный момент находящихся в одной точке (окрестности).

Во-первых, «относительная скорость» — понятие весьма скользкое и в СТО/ОТО лучше его не употреблять. Например, если два фотона движутся в противоположных направлениях, скорость увеличения расстояния между ними равна 2c — даже в тот момент, когда они находятся в одной точке. Так что если вы именно это понимаете под «относительной скоростью», то вы не правы. Если же вы под ней понимаете «скорость одного тела в СО другого» (при любом выборе такой СО), то вы тоже не правы — она как раз не может быть любой, а ограничена c, даже если тела находятся в разных точках.

Во-вторых, скорость тела (в некоторой СО) ограничена c совершенно независимо от наличия других тел. Точнее, она <c, если тело имеет ненулевую вещественную массу, =c, если тело имеет нулевую массу (и ненулевую энергию) и >c, если тело имеет мнимую массу (хотя частицы с мнимой массой науке неизвестны, а в квантовой теории поля их появление в спектре частиц и вовсе имеет особый смысл).

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

Есть просто понятие «скорость» (в рамках некоторой СО) — она ограничена c. И есть понятие «скорость изменения расстояния» (то есть производная от расстояния по времени) (опять же, в рамках некоторой СО) — она ничем не ограничена. Их надо чётко различать.

> Единственный способ измерять расстояния и скорости далеких от нас систем — обмениваться с ними фотонами и замерять интервалы времени

Так вы измерите красное смещение, а скорость и расстояние всё равно придётся рассчитывать. И в зависимости от используемой системы координат результаты получатся совершенно разные, даже при фиксированных метрике ПВ и вашей мировой линии в нём.

> в итоге получаемая скорость будет меньше скорости света.

Скорость увеличения расстояния между телами может бесконечно долго в будущем быть >c (даже сколь угодно больше) — даже если тела всё время обмениваются сигналами и тем самым рано или поздно узнают любые факты о жизни друг друга.

Пример. Ограничимся плоским пространством-временем (то есть СТО) и одним пространственным измерением. Есть тела А и Б. В ИСО (t, x), связанной с телом А, тело Б движется по закону
x = vt (v<c).
Очевидно, тела могут вечно успешно обмениваться сигналами.

Перейдём теперь в неинерциальную СО (T, X) следующим образом:
x = cT*sh(X)
t = cT*ch(X)
В этой СО тела А и Б неподвижны — для тела А X=0, для тела Б X=arth(v/c). Тем не менее, в этой СО само пространство расширяется (масштабный фактор прямо пропорционален времени), так что тела удаляются друг от друга (в смысле, расстояние между ними увеличивается), но уже не со скоростью v, а со скоростью c*arth(v/c). Эта скорость может быть сколь угодно большой — например, если v=0.999c, то c*arth(v/c)~=3.8c. Сигналами обмениваться это им не мешает, так как скорость удаления светового сигнала от источника в расширяющемся пространстве сама >c.

> Расчетная же скорость может быть любой, тут СТО не возражает, ее волнуют только взаимодействующие системы.

СТО — не квантовая механика, для неё нет никакой разницы, является ли скорость «расчётной» или «измеренной», равно как и факт наличия/отсутствия взаимодействия. Наличие ограничения «относительной скорости» скоростью света, подытожу, зависит исключительно от того, что вы под этим понимаете, а вовсе не от того, взаимодействуют тела или нет.

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Date of birth
Registered
Activity