const
-квалификаторы для членов позволяют компилятору предполагать, что - после инициализации объекта - эти члены не должны быть изменены каким-либо образом, и он может оптимизировать код соответствующим образом (см., Например, комментарий @Ajay Brahmakshatriya ).
Таким образом, важно отличать фазу инициализации от последующих фаз, на которых будут применяться назначения , т.е. с какого момента компилятор может предположить, что объект был инициализирован и имеет эффективный тип, на который можно положиться.
Я думаю, что есть главное различие между вашим примером и тем, что вы приняли в принятом ответе. В этом SO-ответе, целевой агрегатный объект с константными типами элементов создается через malloc
:
ImmutablePoint init = { .x = x, .y = y };
ImmutablePoint *p = malloc(sizeof *p);
memcpy(p, &init, sizeof *p);
Согласно правилам того, как хранимое значение объекта может доступ (см. эту часть онлайн-проекта стандарта c ), целевой объект p
впервые получит свой эффективный тип в ходе выполнения memcpy
; эффективный тип - это тип исходного объекта init
, а первый memcpy
объекта, получившего malloced
, можно рассматривать как инициализацию. Однако впоследствии изменение константных членов целевого объекта будет UB (я думаю, что даже секунда memcpy
будет UB, но это, вероятно, основано на мнении).
6.5 Выражения
- Эффективным типом объекта для доступа к его сохраненному значению является объявленный тип объекта, если таковой имеется. 87) ... Если значение копируется в объект, не имеющий объявленного типа, используя memcpy или memmove, или копируется как массив символьного типа, , тогда эффективный тип модифицированного объекта для этот доступ и для последующих обращений, которые не изменяют значение, является эффективным типом объекта, из которого копируется значение , если оно имеется. Для всех других обращений к объекту, у которого нет объявленного типа, эффективным типом объекта является просто тип lvalue, используемого для доступа.
87) Выделенные объекты не имеют объявленного типа.
blockquote>Однако в вашем примере целевой объект
dst
уже имеет объявленный тип в своем определенииstruct vector dst;
. Следовательно, const-квалификаторы на элементахdst
уже существуют до примененияmemcpy
, и его следует рассматривать как назначение, а не инициализацию.Так что я бы проголосовал за UB в этом случае.
Это - довольно классическое сражение между непротиворечивостью и масштабируемостью и - в некоторой степени - доступность. Некоторые данные должны не всегда быть настолько последовательными. Например, взгляд на digg.com и количество diggs против истории. Существует хороший шанс, что значение дублировано в записи "digg" вместо того, чтобы вынудить DB сделать соединение против "user_digg" таблицы. Имеет значение, если то число не совершенно точно?Наверное, нет. Затем использование чего-то как SimpleDB могло бы быть подходящим вариантом. Однако, если Вы пишете банковскую систему, необходимо, вероятно, оценить непротиворечивость прежде всего остального.:)
Если Вы не знаете со дня 1, что необходимо иметь дело с крупным масштабом, я придерживался бы простых более стандартных систем как RDBMS. Если Вы будете работать где-нибудь с разумной бизнес-моделью, то Вы будете, надо надеяться, видеть большой скачок в доходе, если будет большой скачок в трафике. Затем можно использовать те деньги для помощи решению масштабирующихся проблем. Масштабирование трудно, и масштабирование трудно предсказать. Большинством масштабирующихся проблем, которые причиняют Вам боль, будут, которые Вы никогда не ожидаете.
Я очень успешно начал бы сайт и провел бы несколько недель, устраняя проблемы масштаба, когда трафик берет, затем проводят так много времени, вызывая беспокойство о масштабе, что мы никогда не добираемся до производства, потому что мы остаемся без денег.:)
Принятие Вас говорит об этом SimpleDB, Вы не worrywart; существуют настоящие причины для не использования его в качестве реального мира DBMS.
Свойства, которые Вы получаете от поддержки транзакции в DBMS, могут быть сокращены акронимом "A.C.I.D".: Атомарность, Непротиворечивость, Изоляция и Длительность. A и D главным образом имеют отношение к системным катастрофическим отказам и C, и я имею отношение к регулярной операции. Они - все вещи, которые люди полностью считают само собой разумеющимся при работе с коммерческими базами данных, поэтому если Вы работаете с базой данных, которая не имеет одного или нескольких из них, Вы могли бы быть в для любого количества противных неожиданностей.
Атомарность: Любая транзакция или завершится полностью или нисколько (т.е. она будет или фиксировать или прерываться чисто). Это относится к отдельным операторам (как, "обновляют таблицу..."), а также дольше, более сложные транзакции. Если у Вас нет этого, то что-либо, что идет не так, как надо (как, диск, становящийся полным, компьютерным катастрофическим отказом, и т.д.), могло бы оставить что-то полусделанным. Другими словами, Вы никогда не можете полагаться на DBMS, чтобы действительно сделать вещи, которым Вы говорите его, потому что любое количество реальных проблем может помешать, и даже простой оператор UPDATE мог бы стать частично завершенным.
Непротиворечивость: Любые правила, которые Вы настроили о базе данных, будут всегда осуществляться. Как, если у Вас есть правило, в котором говорится всегда, равняется B, затем ничто, что кто-либо делает к системе баз данных, может нарушить то правило - это приведет к сбою любую операцию, которая пробует. Это не вполне как важное, если весь Ваш код прекрасен..., но действительно, когда что когда-либо имеет место? Плюс при пропавших без вести этой системы поддержки вещи добираются действительно yucky, когда Вы проигрываете...
Изоляция: Любые действия, взятые, база данных выполнится, как будто они произошли последовательно (по одному), даже если в действительности они происходят одновременно (чередованный друг с другом). Если больше чем один пользователь соберется поразить эту базу данных одновременно, и у Вас нет этого, то вещи, которые Вы не можете даже выдумать, пойдут не так, как надо; даже атомарные операторы могут взаимодействовать друг с другом непредвиденными способами и завинтить вещи.
Длительность: Если Вы теряете питание или катастрофические отказы программного обеспечения, что происходит с транзакциями базы данных, которые происходили? Если у Вас есть длительность, ответ - "ничто - они - весь сейф". Базы данных делают это при помощи чего-то позвонившего "Отмена / Вход Восстановления", где каждая небольшая вещь, которую Вы делаете к базе данных, сначала зарегистрирована (обычно на отдельном диске для безопасности) в некотором роде таким образом, что можно восстановить текущее состояние после отказа. Без этого другие свойства выше являются видом бесполезных, потому что Вы никогда не можете быть на 100% уверены, что вещи останутся последовательными после катастрофического отказа.
Какая-либо из этих вещей имеет значение для Вас? Ответ имеет все, чтобы сделать с типами транзакций, которые Вы делаете, и что гарантирует, что Вы хотите в ситуации с отказом. Могут быть случаи (как база данных только для чтения), где Вам не нужны они, но как только Вы начинаете делать что-либо нетривиальное, и что-то плохо происходит, Вам жаль, что у Вас не было их. Возможно, для Вас нормально просто возвращаться к резервному копированию каждый раз, когда что-то неожиданное происходит, но мое предположение - то, что это не.
Также обратите внимание, что отбрасывание всех этих мер защиты не делает его, учитывая, что Ваша база данных будет работать лучше; на самом деле это - вероятно, противоположное. Поэтому реальное программное обеспечение DBMS также имеет тонны кода для оптимизации производительности запросов. Так, если Вы пишете запрос, который присоединяется к 6 таблицам на SimpleDB, не предполагайте, что он выяснит оптимальный способ выполнить тот запрос - Вы могли бы закончить тем, что ожидали часы его для завершения, когда коммерческий DBMS мог использовать индексируемое хэширование и получить его через.5 секунд. Существует огромное количество небольших приемов, которые можно сделать, чтобы оптимизировать производительность запросов и верить мне, Вы действительно пропустите их, когда их не стало.
Ни одно из этого не предназначено как удар по SimpleDB; возьмите его от автора программного обеспечения: "Хотя это - большой обучающий инструмент, я не могу предположить, что любой хотел бы использовать его для чего-либо еще".