На практике пространство для статического хранилища может быть выделено как часть начальной двоичной загрузки или во время выполнения при запуске; но всегда будет происходить до того, как встретится код пользователя.
В дополнение к ограничениям, которые Kerrek SB упоминает, хранилище для значения const expr
может быть исключено, если само значение никогда не используется во время выполнения.
Это не обязательно означает, что значение не нужно оценивать - если статическое const expr
использовалось только как условие ветвления, это условие может оцениваться статически, а другие пути кода могут не генерироваться или могут быть исключены оптимизатором.
Практически любое хранилище с продолжительностью static
может быть исключено, если реализация может гарантировать поведение, как если бы хранилище присутствовало - т.е. выражение сравнения, которое может быть оценено во время компиляции - как другое const expr
, сравнение указателя где известно, что rhs - это псевдоним другой переменной или, возможно, несовместимый тип. Это также может быть исключено, если значение считывается только в переменные, которые сами никогда не читаются; или где значение может быть уменьшено до const expr
.
struct Foo{};
static Foo bar; // static instance
Foo* func() {
if ( ! (&bar) ) { // always non-NULL
// this block may be eliminated
Foo* myCopy(new Foo(bar));
return myCopy;
}
// so 'bar' is never referred to, and we know it has no side-
// effects, so the static variable can be eliminated
return new Foo();
}
3.7.1 Статическая продолжительность хранения
2.
Если объект статической длительности хранения имеет инициализацию или деструктор с побочными эффектами, он не должен быть удален, даже если он не используется, за исключением того, что объект класса или его копия могут быть удалены, как указано в 12.8. .