Это довольно известное поведение. Я не говорю, что это не неожиданно.
Дело в том, что SQL Server пытается связать имена с объектами, как один из первых элементов id с запросом. При подзапросе он сначала пытается связать столбцы с таблицами в подзапросе; если это не удастся, оно свяжет столбцы с таблицами во внешнем запросе.
На самом деле это отличная причина всегда использовать псевдонимы со столами.
There are a couple of things that affect the answer:
const
it will almost certainly be optimized out in any case. That means that the resulting code will most likely be the same.static
members are stored elsewhere which means less locality and probably a cache miss.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:
теоретически первый метод немного лучше, так как он только активирует переменную один раз.
Однако компилятор просто удалит любую строку «const» и заменит «cout << 12; " в функцию (очевидно, при компиляции с оптимизацией).
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.
При первом приведении ABC будет инициализирован только один раз, на первый вызов функции. Во втором случае ABC будет инициализироваться каждый раз. Вы почувствуете разницу, если ABC - сложный тип с конструктором. Он мог выделить память или инициализировать мьютекс. Для int на практике нет никакой разницы.
Согласно стандарту C ++ 03 3.7.1 / 2:
Если объект со статической продолжительностью хранения имеет инициализацию или деструктор с побочными эффектами, 12.8.
Для базового типа, такого как целочисленное значение, я бы отложил использование статики как «преждевременную оптимизацию», если вы не провели сравнительный анализ и не приняли во внимание различные компромиссы. (например, для инициализации статического значения ненулевым значением часто требуется запись в таблице, чтобы указать позицию, размер и начальное значение, которые должны быть установлены при загрузке кода).
Если вы не берете указатель на int и он разыменовывается после того, как ваша функция возвращается, тогда вам не нужна статика - позвольте компилятору выполнить оптимизацию.
Если указатель на значение разыменовывается после выхода из вашей функции, я бы классифицировал его как постоянную переменную состояния и было бы хорошей практикой определить его на уровне класса или модуля, чтобы прояснить это.
Я бы выбрал второй - он более читабельный. зачем без надобности добавлять ключевое слово (статическое), которое на самом деле не добавляет никакой ценности тому, кто читает код.