Статическая постоянная в сравнении с постоянной в функции, которая вызывается повторно

Это довольно известное поведение. Я не говорю, что это не неожиданно.

Дело в том, что SQL Server пытается связать имена с объектами, как один из первых элементов id с запросом. При подзапросе он сначала пытается связать столбцы с таблицами в подзапросе; если это не удастся, оно свяжет столбцы с таблицами во внешнем запросе.

На самом деле это отличная причина всегда использовать псевдонимы со столами.

30
задан Keith Pinson 30 July 2012 в 15:06
поделиться

6 ответов

There are a couple of things that affect the answer:

  • First, as long as the value is const it will almost certainly be optimized out in any case. That means that the resulting code will most likely be the same.
  • Second, static members are stored elsewhere which means less locality and probably a cache miss.
  • Third, the cost of initialization depends on the type. In your case, for an int, the cost of initialization is basically nonexistent. For more complex user-defined types, it may be huge.

So the answer is, in cases simple enough for the compiler to figure them out and optimize, it makes zero difference. In your example that would almost certainly be the case.

As long as the variable has a type that is easy and cheap to construct, prefer non-static to avoid the cache miss.

If the type is expensive to construct, you might want to use static.

And of course, last, and most importantly of all:

Don't trust our guesswork. If you are concerned about performance, there is only one correct course of action:

  • Measure it, to verify that it is actually a problem
  • Measure the performance of each possible solution
  • Pick the solution that results in the best performance.
51
ответ дан 27 November 2019 в 22:15
поделиться

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

Однако компилятор просто удалит любую строку «const» и заменит «cout << 12; " в функцию (очевидно, при компиляции с оптимизацией).

2
ответ дан 27 November 2019 в 22:15
поделиться

It depends on the compiler.

In embedded software, a static const will typically be stored in flash (i.e. code memory), and will be accessed directly, like a normal variable, without any need for initialisation.

In contrast, a non-static const may have its value stored in flash, but the const itself will be created on the stack like a variable, and be initialised just like a variable.

If this is how your compiler handles these scenarios, then the static const is more efficient, as it requires neither stack allocation nor initialisation.

Obviously, these scenarios may be handled different by non-embedded compilers.

1
ответ дан 27 November 2019 в 22:15
поделиться

При первом приведении ABC будет инициализирован только один раз, на первый вызов функции. Во втором случае ABC будет инициализироваться каждый раз. Вы почувствуете разницу, если ABC - сложный тип с конструктором. Он мог выделить память или инициализировать мьютекс. Для int на практике нет никакой разницы.

Согласно стандарту C ++ 03 3.7.1 / 2:

Если объект со статической продолжительностью хранения имеет инициализацию или деструктор с побочными эффектами, 12.8.

2
ответ дан 27 November 2019 в 22:15
поделиться

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

Если вы не берете указатель на int и он разыменовывается после того, как ваша функция возвращается, тогда вам не нужна статика - позвольте компилятору выполнить оптимизацию.

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

0
ответ дан 27 November 2019 в 22:15
поделиться

Я бы выбрал второй - он более читабельный. зачем без надобности добавлять ключевое слово (статическое), которое на самом деле не добавляет никакой ценности тому, кто читает код.

-1
ответ дан 27 November 2019 в 22:15
поделиться
Другие вопросы по тегам:

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