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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
#1

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

29.01.2012, 21:12. Просмотров 948. Ответов 3
Метки нет (Все метки)

Страуструп написал такую функцию для его книги "принципы и практика использования 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[].
Почему он статический? Потому что большой и чтобы его каждый раз не создавать его сделали статическим?
Вообще когда надо делать большие неизменяемые( как этот ) объекты статическими?
Если мы знаем, что функция вызывается много раз, то тут вроде как понятно, что надо сделать объект статическим. Но ведь не всегда известно сколько раз будет вызываться функция.
Это ведь эквивалентно выделить память и не освобождать ее до конца выполнения программа. Только массив находится в статической памяти, а выделенная память в куче. Но все равно в итоге и в той и в другой памяти это занимает место.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.01.2012, 21:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Оптимизация. static объекты (C++):

Функция создает объекты и указателями на них заполняет массив. При выходе из функции вызываются деструкторы объектов. Как сохранить объекты? - C++
Вопрос прост: как при выходе из функции сохранить объекты, которые были созданы в данной функции (указатели объектов положены в массив)?

В окне перемещаются объекты, отталкиваясь от стенок окна. Каждый объект имеет свой поток, перемещающий его. Встретившись, объекты начинают двигаться - C++
В окне перемещаются объекты, отталкиваясь от стенок окна. Каждый объект имеет свой поток, перемещающий его. Встретившись, объекты...

Static - C++
zagolovok.hpp static int a; основной модуль #include &lt;iostream&gt; #include &quot;zagolovok.hpp&quot; int main

Static class c++ - C++
Можно ли сделать класс чисто статическим? То есть не прописывать отдельно для каждой переменой, функции static, а одним разом всех ? ...

Static Library - C++
Привет всем! Нужно проанализировать (понять, что она делает) статичную библиотеку, собранную под Linux (.a), используя Windows. Как это...

static-член - C++
Привет. Как сделать чтобы при каждом создании объекта класса, увеличивался его счетчик. вот сами классы: class Base{ public: ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
NoMasters
Псевдослучайный
1754 / 1097 / 72
Регистрация: 13.09.2011
Сообщений: 3,134
29.01.2012, 21:28 #2
Цитата Сообщение от Chelioss Посмотреть сообщение
Это ведь эквивалентно выделить память и не освобождать ее до конца выполнения программа. Только массив находится в статической памяти, а выделенная память в куче. Но все равно в итоге и в той и в другой памяти это занимает место.
А теперь угадай, где хранились бы данные, которыми инициализировался бы массив, если бы он не был статическим.
Всегда, когда у тебя есть сколько-то большие заведомо неизменяемые объекты, лучше сделать их статическими.
1
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
29.01.2012, 21:37  [ТС] #3
Цитата Сообщение от NoMasters Посмотреть сообщение
А теперь угадай, где хранились бы данные, которыми инициализировался бы массив, если бы он не был статическим.
Т.е. строки, которые находятся в статической памяти, копировались бы в стекувую память без static? А со static копирования не было бы что ли?

Возник вопрос про статическую память. Этот массив записывается в статическую память во время выполнения программы, когда выполняется эта строка(10 в листинге в первом посте)
или во время компиляции? Вот строки "" заноясятся сразу во время компиляции.
0
NoMasters
Псевдослучайный
1754 / 1097 / 72
Регистрация: 13.09.2011
Сообщений: 3,134
29.01.2012, 21:43 #4
Цитата Сообщение от Chelioss Посмотреть сообщение
Т.е. строки, которые находятся в статической памяти, копировались бы в стекувую память без static?
Нет, строки никуда не копировались бы, только массив структур SuffixMap, где на них есть указатели. Вся статическая память формируется во время компиляции.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.01.2012, 21:43
Привет! Вот еще темы с ответами:

Private: static - C++
В хедере есть клас point, клас точек, которые должны иметь нумерацию. В поле private у него есть static атрибут free_id, в который...

static class - C++
Хочу создать static class, в котором будет находится static переменная, чтобы она была доступна из разных классов. helper.h static...

static const? - C++
если мне нужна константа в классе, как ее лучше объявить со static или без? разница будет только в том, что со статиком мне можно будет...

Назначение static ? - C++
Здравствуйте. Я уже прочитал в двух книгах про статик,читал в википедии,но так и не понимаю для чего он ? Кучи больших текстов и объяснений...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
29.01.2012, 21:43
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru