Когда компиляторы встраивают код C++?

Реляционная база данных является чрезвычайно мощной абстракцией; это - набор фактов и исчисления предикатов. Не только, что, SQL осуществляет разделение запроса команды при наличии одного пункта для исследования строк и другого для изменения строк.

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

, Если возможно, Вы хотите вычеркнуть пустые значения столбцов из своей базы данных. Если Вы соглашаетесь с моим представлением базы данных как механизм обоснования истины, то пустые указатели являются настоящей проблемой. То, когда Вы имеете, аннулирует в базе данных, которую закон исключенного третьего делает не , содержат. Это делает "доказательство противоречием" любого данного свойства базы данных более трудным, что это было бы без пустых указателей. Аннулирует излишне усложняют семантику базы данных.

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

Наконец, слово на хранимых процедурах, а не прямых запросах. На достойной базе данных можно установить права доступа на хранимых процедурах независимо от базовых таблиц. Это, отдельно, является причиной достаточно для рассматривания использование хранимых процедур экстенсивно. С хранимыми процедурами Вы создаете модель повышения безопасности, чем возможно с прямым доступом SQL.

18
задан Tony the Pony 18 September 2009 в 11:32
поделиться

10 ответов

Да, компилятор может встраивать код, даже если он явно не объявлен как inline .

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

27
ответ дан 30 November 2019 в 05:40
поделиться

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

Обоснование выбора ] inline , поскольку ключевое слово, похоже, состоит в том, что единственная причина, по которой можно было бы определить функцию (не шаблонную) в заголовке, заключается в том, чтобы ее мог встроить компилятор. Компилятор не может встроить вызов функции, если у него нет полного определения. Если функция не определена в заголовке, компилятор имеет только объявление и не может встроить функцию, даже если бы захотел.

В настоящее время я ' Вы слышали, что не только компилятор оптимизирует код, но и компоновщик тоже может это делать. Компоновщик может (если он этого еще не делает) встраивать вызовы функций, даже если функция не была определена в том же модуле компиляции.

И, вероятно, не рекомендуется определять функции, размер которых превышает одну строку заголовок, если вообще (плохо для времени компиляции, и если большая функция будет встроена, это может привести к раздуванию и снижению производительности).

38
ответ дан 30 November 2019 в 05:40
поделиться

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

Также обратите внимание, что функции-члены класса имеют неявное встроенное украшение, если они определены прямо в определении класса.

5
ответ дан 30 November 2019 в 05:40
поделиться

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

4
ответ дан 30 November 2019 в 05:40
поделиться

Если я не ошибаюсь, при включении оптимизации компилятор встроит любую подходящую процедуру или метод.

4
ответ дан 30 November 2019 в 05:40
поделиться

Текст из Информационного центра IBM ,

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

Язык C Любая функция, за исключением main, может быть объявлена ​​или определяется как встроенный со встроенным спецификатор функции. Статический локальный переменные не могут быть определяется в теле встроенного

Функции C ++ , реализованные внутри объявления класса, автоматически определяемый встроенный. Обычный Функции C ++ и функции-члены объявлен вне класса декларация, за исключением main, может быть объявлен или определен как встроенный со встроенной функцией спецификатор. Статические локальные переменные и строка литералы, определенные в теле встроенные функции рассматриваются как один и тот же объект в единицах перевода;

3
ответ дан 30 November 2019 в 05:40
поделиться

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

Если компилятор не встроит код, ключевое слово inline будет иметь тот же эффект, что и static , и каждая единица компиляции, которая вызывает код, будет иметь свою собственную копию. Умный компоновщик может уменьшить их до единственной копии.

2
ответ дан 30 November 2019 в 05:40
поделиться

Компилятор оптимизирует по своему усмотрению, если вы не укажете обратное.

1
ответ дан 30 November 2019 в 05:40
поделиться

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

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

Типичными случаями, когда встраивание нарушает семантику кода, являются виртуальные вызовы и передача адреса функции в другую функцию или его сохранение.

1
ответ дан 30 November 2019 в 05:40
поделиться

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

Функции-члены по умолчанию объявляются встроенными (компилятор решает и здесь)

Это не жесткие правила. Это зависит от реализации компилятора.

Если кто-нибудь знает другие факторы, пожалуйста, напишите.

0
ответ дан 30 November 2019 в 05:40
поделиться
Другие вопросы по тегам:

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