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

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

Войти
Регистрация
Восстановить пароль
 
 
Undisputed
187 / 118 / 28
Регистрация: 10.06.2014
Сообщений: 1,519
Завершенные тесты: 3
#1

Использование указателей на контейнеры STL в заголовочных файлах - C++

26.02.2017, 19:46. Просмотров 698. Ответов 50
Метки нет (Все метки)

Для использования указателей на I/O классы достаточно включить <iosfwd> который содержит опережающие объявления и таким образом появляется возможность объявить указатель например на stringstream в заголовочном файле
C++
1
2
3
4
//some.h
#include <iosfwd>
 
void bar(std::stringstream *s);
а как быть если хочется объявить указатель в заголовочном файле например на std::map<T,T> или std::string?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.02.2017, 19:46
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Использование указателей на контейнеры STL в заголовочных файлах (C++):

Про добавление заголовочных файлов в заголовочных файлах - C++
В который раз эта вещь засовывает мозги в блендер! Я про то, что не могу однозначно запомнить (основываясь на моих знаниях о директиве...

Использование STL в DLL-файлах - C++
Хочу использовать библиотеку STL в своем DLL-проекте. В частности для обеспечения функциональности требуется применение классов vector и...

Массивы в заголовочных файлах - C++
в заголовочном файле в описании класса пишу: int _const_iMas = {0x63,0x7c,0x78,0x79}; В итоге компилятор подчёркивает знак '='...

О стандартных заголовочных файлах - C++
Не знаю в какую категорию отнести данное нубство, но все же: Часто использую некоторые возможности/функции для которых не делал...

Контейнеры STL - C++
Кто знает где найти информацию по поводу стандартных контейнеров STL? Интересует не то, как их применять, а основы реализации. Может быть...

Линковка, реализация в заголовочных файлах - C++
Ситуация следующая. Представим себет хедер, который содержит некоторый функционал и должен использоваться в нескольких проектах. Причем ...

50
tapochka
40 / 40 / 8
Регистрация: 25.04.2014
Сообщений: 499
27.02.2017, 00:28 #31
Цитата Сообщение от hoggy Посмотреть сообщение
В частности, все топовые компиляторы умеют "предварительно скомпилированный заголовок"
а можно поподробнее про это... вот у меня хэллоуворлд на 5 строк... где там precompiled header?
0
hoggy
6860 / 3067 / 525
Регистрация: 15.11.2014
Сообщений: 6,961
Завершенные тесты: 1
27.02.2017, 00:34 #32
Цитата Сообщение от tapochka Посмотреть сообщение
а можно поподробнее про это... вот у меня хэллоуворлд на 5 строк... где там precompiled header?
http://g.zeos.in/?q=%D1%81%2B%2B%20%...0%BE%D0%BA&m=1
0
nd2
2820 / 2390 / 851
Регистрация: 29.01.2016
Сообщений: 8,004
27.02.2017, 00:35 #33
Цитата Сообщение от tapochka Посмотреть сообщение
где там precompiled header?
Среда какая?
0
tapochka
40 / 40 / 8
Регистрация: 25.04.2014
Сообщений: 499
27.02.2017, 00:35 #34
hoggy, ну это как то не красиво так отвечать...

nd2, ну, допустим, vim и gcc
0
hoggy
6860 / 3067 / 525
Регистрация: 15.11.2014
Сообщений: 6,961
Завершенные тесты: 1
27.02.2017, 00:40 #35
tapochka,
Предлагаете сюда текст скопипастить?
0
nd2
2820 / 2390 / 851
Регистрация: 29.01.2016
Сообщений: 8,004
27.02.2017, 00:43 #36
Цитата Сообщение от tapochka Посмотреть сообщение
ну, допустим, vim и gcc
Это же не среда. Как там настройки делать - без понятия. Google в помощь.
0
tapochka
40 / 40 / 8
Регистрация: 25.04.2014
Сообщений: 499
27.02.2017, 00:45 #37
hoggy, та не, зачем... просто казалось, здесь публика все-таки дружелюбнее лора или говнокода.ру

Добавлено через 1 минуту
nd2, ну было сказано, что
все топовые компиляторы умеют "предварительно скомпилированный заголовок"
, а gcc содержит g++... вот я и спросил где там этот самый заголовок
0
nd2
2820 / 2390 / 851
Регистрация: 29.01.2016
Сообщений: 8,004
27.02.2017, 00:46 #38
Цитата Сообщение от tapochka Посмотреть сообщение
gcc
https://ru.wikipedia.org/wiki/%D0%9F...0%BA%D0%B8#GCC
0
tapochka
40 / 40 / 8
Регистрация: 25.04.2014
Сообщений: 499
27.02.2017, 00:49 #39
nd2, ну так про это я знал) я думал имелось ввиду, что какие-то заголовки априори в некий precompiled header засовываются... видимо не так понял ответ
0
Undisputed
187 / 118 / 28
Регистрация: 10.06.2014
Сообщений: 1,519
Завершенные тесты: 3
27.02.2017, 10:46  [ТС] #40
Цитата Сообщение от nd2 Посмотреть сообщение
Если я его правильно понял, то он выясняет: можно ли так сделать, чтобы подключать любой хедер оин раз в программе, вне зависимости от количества единиц трансляции, в которых данные из этого хедера используются.
Не совсем так. Возможно я не правильно изложил суть. Смотрю в основном акцент ответов делается на ускорение процесса компиляции. Меня же волнует немного другое, а именно:

1. Есть std::map
2. Насколько я понимаю в каждую единицу трансляции он включается отдельно
3. Включение этого файла в единицу трансляции означает что программный код этой самой единицы трансляции увеличивается на + "исходный код map" (надеюсь понятно что имеется ввиду)
4. Ввиду того что каждая единица трансляции компилируется независимо друг от друга, происходит дублирование исходного кода std::map. На каждую единицу трансляции - повторяется исходный код map.
5. Мне интересно можно ли этого как нибудь избежать (и нужно ли?)
6. Если избежать на данный момент не получается, то может ли такое дублирование замедлить выполнение программы?

Добавлено через 2 минуты
То есть в первую очередь меня волнует скорость. В данный момент думаю что генерируется оптимальный машинный код в котором эти вопросы дублирования уже разрулены и остаются лишь команды созданные оптимальным способом для их выполнения.

Добавлено через 1 минуту
Что мне прочитать что бы таких глупых вопросов на эту тему не возникало?
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6967 / 3258 / 327
Регистрация: 04.12.2011
Сообщений: 9,017
Записей в блоге: 5
27.02.2017, 10:59 #41
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от sys_beginner Посмотреть сообщение
на + "исходный код map" (надеюсь понятно что имеется ввиду)
Это неверно и поэтому не может быть понятно.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Шаблон это информация времени компиляции. Он служит для создания кода при инстанциировании. Это значит, что если Вы включили шаблон, но не определили ни одного инстанса, компилятор не сгенерит ни одного байта кода для исполнения.
Код генерит инстанс. Если у Вас есть инстанс то он генерит код. Если у Вас есть инстанс, но вы не хотите чтобы он генерил код, - не компилируйте.
У Вас момент понимания того, что из себя представляет шаблон как таковой, проходит на удивление бурно и болезненно. Это бывает. Успокойтесь и почитайте. В том числе и то, что Вам тут написали.
1
Undisputed
187 / 118 / 28
Регистрация: 10.06.2014
Сообщений: 1,519
Завершенные тесты: 3
27.02.2017, 11:02  [ТС] #42
IGPIGP,
аа... я понял
то есть пофиг сколько раз включается реализация (естественно не в одну ЕТ)
в конечном счете исходный код зависит от того был ли создан объект(ы)
а ответ оказался прост... спасибо!
1
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6967 / 3258 / 327
Регистрация: 04.12.2011
Сообщений: 9,017
Записей в блоге: 5
27.02.2017, 11:12 #43
Цитата Сообщение от sys_beginner Посмотреть сообщение
аа... я понял

sys_beginner, очень часто бывает так, что тем кто понимает, что происходит в коде уже сложно понять как это может быть непонятно. Я иной раз подмечаю, именно потому, что ещё не достаточно опытен.

Добавлено через 6 минут
Цитата Сообщение от sys_beginner Посмотреть сообщение
то есть пофиг сколько раз включается реализация
как я понимаю, шаблон не есть реализация. Шаблон это чертеж реализации. Когда Вы вручную специализируете шаблон вот тогда Вы пишете реализацию. Иначе это сделает компилятор. Он реализует и сразу генерит код. Этого не видно.
Если честно, то в Вашем вопросе есть интересные моменты. Что например происходит если в шаблоне есть определения не шаблонных методов? Я предполагаю, что оно должно игнорироваться пока нет инстанциирования, но интересно было бы услышать.
Во всяком случае сам стараюсь не совмещать. От греха.
0
Undisputed
187 / 118 / 28
Регистрация: 10.06.2014
Сообщений: 1,519
Завершенные тесты: 3
27.02.2017, 11:29  [ТС] #44
Цитата Сообщение от IGPIGP Посмотреть сообщение
очень часто бывает так, что тем кто понимает, что происходит в коде уже сложно понять как это может быть непонятно.
Есть такой момент )
Цитата Сообщение от IGPIGP Посмотреть сообщение
Что например происходит если в шаблоне есть определения не шаблонных методов? Я предполагаю, что оно должно игнорироваться пока нет инстанциирования, но интересно было бы услышать.
В идеале я думаю должно генериться только необходимое для того что бы работала программа без "лишнего" кода.
Тут наверное уже все зависит от того насколько умен компилятор... может в доках компиляторов написано? Если кто нибудь знает прошу дать ссылку на этот момент в GCC/Clang

Цитата Сообщение от IGPIGP Посмотреть сообщение
Во всяком случае сам стараюсь не совмещать. От греха.
А как? Вдруг по логике это требуется? Как я понимаю вы имеете ввиду что то в таком духе?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template<typename T>
struct Foo
{
    void bar(T arg)
    {
    
    }
    //сомнительная карта
    void baz()
    {
    
    }
};
Добавлено через 5 минут
Тогда я думаю все останется как есть просто в зависимости от T будет создано столько bar-ов сколько было для него типов<T>. А baz как был одним так и останется. Ну и будет сгенерирован соответствующий код для выполнения тех методов которые были вызваны.
0
GbaLog-
Любитель чаепитий
3122 / 1462 / 351
Регистрация: 24.08.2014
Сообщений: 5,175
Записей в блоге: 1
Завершенные тесты: 2
27.02.2017, 11:42 #45
Цитата Сообщение от sys_beginner Посмотреть сообщение
что то в таком духе
А в чём смысл? Компилятор, в данном случае, не сгенерирует ни байта под этот класс, пока не будет инстанса. Будет инстанс, будет сгенерирован код для всех методов, в которых шаблоны юзаются. Вообще не понял, о чём товарищ IGPIGP говорит. Код генерируется только если был инстанс.
Другой вопрос, что будет в этом коде, и сгенерируется ли для foo() код.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct A
{
  template<typename>
  void foo() {}
  
  void bar() {}
};
 
int main()
{
  A a;
  a.bar();
}
Думаю, что нет, ведь мы не вызывали функцию foo, а это значит, что инстанса не было.
Ну, это моё видение, как оно на самом деле, я могу только догадываться.
2
27.02.2017, 11:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.02.2017, 11:42
Привет! Вот еще темы с ответами:

Определение переменных в заголовочных файлах - C++
Здорова! Определил переменную в заголовочном фале от так #pragma once #ifndef _imya_zagol_fayla #define _imya_zagol_fayla ...

Начала STL и контейнеры C++ - C++
Вот такой вот простенький текст предлагается &quot;Начала STL и контейнеры C++&quot;. Скачать свободно можете здесь - и короткие главки (их 21 на...

Начала STL и контейнеры C++ - C++
Многие улучшения, сделанные из C в C++ вызывают сомнения и вопросы... Именно поэтому, наверное, при любви к C++ вузовских пЫдагогов, в...

Ассоциативные контейнеры STL - C++
Везде сказано: set - упорядоченное множество уникальных элементов. (есть куча примеров и уроков) multiset - то же что и set, но...


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

Или воспользуйтесь поиском по форуму:
45
Ответ Создать тему
Опции темы

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