Форум программистов, компьютерный форум CyberForum.ru

Оптимизация. static объекты - C++

Восстановить пароль Регистрация
 
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
29.01.2012, 21:12     Оптимизация. static объекты #1
Страуструп написал такую функцию для его книги "принципы и практика использования C++":
( обратите внимание на массив SuffixMap )
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Suffix::Encoding get_encoding(const string& s)
{
    struct SuffixMap 
    { 
        const char*      extension;
        Suffix::Encoding suffix;
    };
 
    static SuffixMap smap[] = {
        {".jpg",  Suffix::jpg},
        {".jpeg", Suffix::jpg},
        {".gif",  Suffix::gif},
    };
 
    for (int i = 0, n = ARRAY_SIZE(smap); i < n; i++)
    {
        int len = strlen(smap[i].extension);
 
        if (s.length() >= len && s.substr(s.length()-len, len) == smap[i].extension)
            return smap[i].suffix;
    }
 
    return Suffix::none;
}
В этой функции создается массив static SuffixMap smap[].
Почему он статический? Потому что большой и чтобы его каждый раз не создавать его сделали статическим?
Вообще когда надо делать большие неизменяемые( как этот ) объекты статическими?
Если мы знаем, что функция вызывается много раз, то тут вроде как понятно, что надо сделать объект статическим. Но ведь не всегда известно сколько раз будет вызываться функция.
Это ведь эквивалентно выделить память и не освобождать ее до конца выполнения программа. Только массив находится в статической памяти, а выделенная память в куче. Но все равно в итоге и в той и в другой памяти это занимает место.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.01.2012, 21:12     Оптимизация. static объекты
Посмотрите здесь:

C++ static-член
C++ В окне перемещаются объекты, отталкиваясь от стенок окна. Каждый объект имеет свой поток, перемещающий его. Встретившись, объекты начинают двигаться
Функция создает объекты и указателями на них заполняет массив. При выходе из функции вызываются деструкторы объектов. Как сохранить объекты? C++
C++ Назначение static ?
C++ static class
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
29.01.2012, 21:28     Оптимизация. static объекты #2
Цитата Сообщение от Chelioss Посмотреть сообщение
Это ведь эквивалентно выделить память и не освобождать ее до конца выполнения программа. Только массив находится в статической памяти, а выделенная память в куче. Но все равно в итоге и в той и в другой памяти это занимает место.
А теперь угадай, где хранились бы данные, которыми инициализировался бы массив, если бы он не был статическим.
Всегда, когда у тебя есть сколько-то большие заведомо неизменяемые объекты, лучше сделать их статическими.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
29.01.2012, 21:37  [ТС]     Оптимизация. static объекты #3
Цитата Сообщение от NoMasters Посмотреть сообщение
А теперь угадай, где хранились бы данные, которыми инициализировался бы массив, если бы он не был статическим.
Т.е. строки, которые находятся в статической памяти, копировались бы в стекувую память без static? А со static копирования не было бы что ли?

Возник вопрос про статическую память. Этот массив записывается в статическую память во время выполнения программы, когда выполняется эта строка(10 в листинге в первом посте)
или во время компиляции? Вот строки "" заноясятся сразу во время компиляции.
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
29.01.2012, 21:43     Оптимизация. static объекты #4
Цитата Сообщение от Chelioss Посмотреть сообщение
Т.е. строки, которые находятся в статической памяти, копировались бы в стекувую память без static?
Нет, строки никуда не копировались бы, только массив структур SuffixMap, где на них есть указатели. Вся статическая память формируется во время компиляции.
Yandex
Объявления
29.01.2012, 21:43     Оптимизация. static объекты
Ответ Создать тему
Опции темы

Текущее время: 09:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru