Технофашист
228 / 216 / 11
Регистрация: 11.03.2009
Сообщений: 887
|
||||||||||||||||||||||||||
1 | ||||||||||||||||||||||||||
Шаблоны25.04.2011, 23:50. Показов 3202. Ответов 23
Метки нет (Все метки)
Пусть есть шаблон-структура.
Пробовал завести родителя (пусть parA) для struct A и создавал указатель этого типа и делал так:
Пробовал сделать родительский класс parA виртуальным и далее через виртуальные методы. Компилятор проглатывает, но ошибка уже на этапе выполнения (ошибка доступа к памяти). Как быть? p.s. нужно реализовать стек, элементы которого имеют поля разного типа, а union не охота использовать.
0
|
25.04.2011, 23:50 | |
Ответы с готовыми решениями:
23
«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». Шаблоны. Плохо понимаемые моменты из книги "Шаблоны С++. Справочник разработчика". (Вандевурд, Джосаттис) Помогите писать на С++ через шаблоны. Консуле я писал, но надо писать исползуя шаблоны Шаблоны |
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
26.04.2011, 00:00 | 2 |
darkAngel, boost::any))
1
|
Технофашист
228 / 216 / 11
Регистрация: 11.03.2009
Сообщений: 887
|
|
26.04.2011, 15:08 [ТС] | 3 |
не доверяю я STL.
Сделал стек из union.
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
26.04.2011, 16:07 | 4 |
Сообщение было отмечено как решение
Решение
*саркастично* Молодец.
boost::any это не STL, это boost. Но ему тоже доверять не надо, ага. *ещё более саркастично* Молодец.
3
|
Технофашист
228 / 216 / 11
Регистрация: 11.03.2009
Сообщений: 887
|
|
26.04.2011, 16:39 [ТС] | 5 |
Евгений Ваганыч?
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
27.04.2011, 00:06 | 6 |
darkAngel, не доверять библиотекам, написанным профессионалами по С++ - глупо.
0
|
Технофашист
228 / 216 / 11
Регистрация: 11.03.2009
Сообщений: 887
|
|
27.04.2011, 00:41 [ТС] | 7 |
дело в перегрузке функционала + могут понадобиться нестандартные функции + свои структуры данных я могу подстраивать под свою задачу (например правильно расположить данные для SSE-инструкций). Мне важна скорость, а не универсальность.
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
27.04.2011, 01:01 | 8 |
darkAngel, Не столь сильно уменьшается скорость, все же в boost и stl люди тоже думали о производительности)
0
|
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
|
|
27.04.2011, 02:22 | 9 |
darkAngel, опиши задачу подробнее. Возможно, можно сделать по-другому.
Кстати, на будущее: важно не абсолютное время работы (одна миллисекунда против двух), а асимптотическое. То есть пропорция, с которой растёт время выполнения программы с увеличением числа входных данных. Так вот в СБШ (стандартной библиотеке шаблонов, она же STL) с этим всё в порядке. Иначе говоря, нужно составлять быстрый алгоритм, а не лезть в дебри излишней оптимизации.
0
|
Технофашист
228 / 216 / 11
Регистрация: 11.03.2009
Сообщений: 887
|
|
27.04.2011, 09:53 [ТС] | 10 |
Я оперирую с большими объёмами данных и вычислений. Для мне каждая лишняя миллисекунда в итоговой картине заметна.
В стеке хранятся элементы разного типа.
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
27.04.2011, 11:00 | 11 |
Это называется вектор (std::vector), но вы ему тоже не доверяете...
union'ы могут ооооочень сильно снизить производительность, т.к. компилятор не может выполнить ряд оптимизаций из-за неизвестности типа, с которым происходит работа. По нормальному реализуй полиморфизм и усё.
0
|
27.04.2011, 13:14 | 12 |
Это массив из union'ов. Массив можно органищовывать хоть ручками, хоть через std::vector - принципиальной разницы нет. В том числе и с точки зрения скорости. Разница будет только при неправильном подходе к задаче
Когда речь идёт о миллисекундах, то "производительность" и "шаблон" - понятия несовместимые, потому как компилятор не имеет права inline'ить шаблонную функцию или метод. Кроме случаев специализации, но если всё специализировать - тогда нафига вообще связываться с шаблоном. Бред. Попробуй привести хотя бы один пример, где из-за union'а производительность снижается. И хотя бы одну оптимизацию, которая не сможет построиться
1
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
27.04.2011, 13:28 | 13 |
C какого перепугу?
Если бы я знал, как работает компилятор, я был бы одним из его разработчиков. Модификатор __restrict говорит нам о том, что union мешает оптимизации. Какой именно - вопрос к разработчикам компилятора. Добавлено через 5 минут Между прочим, миллисекунда это ОЧЕНЬ много. За одну тысячную секунды столько успевается сделать, что пипец просто...
0
|
27.04.2011, 13:34 | 14 | |||||
С такого, что у шаблонной функции может быть специализация. Если компилятор её видит - проинлайнит, но если не видит, то она может быть где-то вдругом месте описана, а потому инлайнить нельзя. И это - 99% случаев
Модификатор restrict говорит о том, то обращения по указателю с модификатором restrict не пересекаются с обращениями по другим указателям. Т.е. если мы имеем код:
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
27.04.2011, 13:44 | 15 |
Его есть два раза. Про первый уже сказано. Второй говорит о том, что в пределах заданного пространства используется только один из типов данных в объединении и компилятор может проводить некоторые оптимизации. Да самое примитивное, занести значение в кэш. Если значение может одновременно использоваться с разными типами, то в кэше его уже не подержишь...
Добавлено через 56 секунд Заинтересовало. Можно пруф? Добавлено через 41 секунду И Link Time Code Generation никто не отменял. А при нём даже из dll инлайнить могёт, не говоря уже о шаблонах.
0
|
27.04.2011, 14:42 | 16 | |||||||||||||||
Можешь ссылку на описание кинуть? Потому что на словах ничегоне понял. Сдаётся мне, это есть какое-то расширение, а не стандарт
Был один из примеров:
Код
$ g++ t1.cc && ./a.out 1 Код
$ g++ t1.cc t2.cc && ./a.out 2 Если я правильно понимаю сей термин, то это не есть что-то особенное. Это всего лишь механизм, при котором множество исходников можно компилить как бы в едином целом, но при этом исходники остаются разнесёнными в разные файлы. К инлайну шаблонов он будет иметь отношение только в том случае, если я не наглючил с примером со специализацией. Да и мало кто пользуется этим из-за сильно увеличивающегося времени компиляции Добавлено через 7 минут Я правильно понимаю, что про __restrict в отношении union'а имелся в виду пример из http://msdn.microsoft.com/en-u... s.80).aspx Так вот это не есть то самое. Это просто следствие из свойства __restrict: еслинаписан такой union, то программист обязан сам следить за тем, чтобы работа одновременно ввелась только с одним из указателей. К тому, что писал darkAngel это не имеет никакого отношения, потому что речь идёт НЕ о чтении значений из union'а, а о чтении значений из указателя (который записан в union'е)
0
|
Технофашист
228 / 216 / 11
Регистрация: 11.03.2009
Сообщений: 887
|
|
27.04.2011, 15:17 [ТС] | 17 |
Добавлено через 53 секунды В принципе ручками и реализовал список, просто было интересно, можно ли через шаблоны. Добавлено через 5 минут а шаблоны вообще решил использовать, т.к. часто ими не пользуюсь, а многие утверждают, что конёк С++ это шаблоны. Вот и решил попробовать.. вроде бы и типы данных разные, а не подошли тут шаблоны.
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
27.04.2011, 15:18 | 18 |
Да, я про это MSDN ссылку говорил. Возможно я не всё корректно из неё понял.)
LTCG откладывает генерацию кода до этапа компоновки, т.е. когда уже известны все варианты использования, все специализации, все параметры и способы вызовов. Известно всё, что можно узнать. Поэтому компилятор делает туеву хучу оптимизаций. Даже виртуальные вызовы встраивает, если может. А уж шаблоны разрулить для него точно не проблема. Загляни в STL, например в вектор, там inline куча объявлений.
0
|
270 / 176 / 46
Регистрация: 12.03.2010
Сообщений: 494
|
|
27.04.2011, 15:25 | 19 |
Шаблоны компилируются в отдельные классы(функции и т.д.) для каждого набора параметров в месте инстанциирования, соответственно, в этом месте должна быть видна и реализация шаблона (в основном в конце хедера шаблона пишут #include "*.cpp", но некоторые компиляторы предусматривают #pragma implementation). Соответственно с inline и другими оптимизациями нет никаких проблем.
0
|
27.04.2011, 16:04 | 20 |
Шаблоны нужно использовать когда у тебя есть похожие действия над разными типами. Т.е. если бы у тебя был отдельный массив int'ов и отдельный массив float'ов - тут можно шаблоном пользоваться. А вот когда у тебя есть один массив, но элеметом является либо int, либо float, то тут надо union использовать. Поняно, что пацанским принципиальным методом было бы виртуальное наследование, но опять-таки это без шаблонов
Не совсем всё, потому что библиотеки обычно компилируются без il'а, но не суть. Мне бы сейчас хотелось понять, законно ли специализацию ставить в такое место, где её может быть не видно одним из запусков компилятора. В своём примере я сделал один запуск компилятора и подал в него два файла. Более честным было бы сделать два раздельных запуска компилятора. Суть от этогоне меняется, но проблема более явно описывается. LTCG - это метод для извращенцев, которые пытаются проблемы проектирования переложить на компилятор. Да и нужен он в первую очередь для таких архитектур, как IA-64 - с предикатными кодами Речь не о реализации, а о специализации. В мойм примере при компиляции первого исходника специализация не видна. Она находится во втором исходнике. Вот я и засомневался, является ли это корректным
0
|
27.04.2011, 16:04 | |
27.04.2011, 16:04 | |
Помогаю со студенческими работами здесь
20
шаблоны Шаблоны шаблоны в си++ Шаблоны Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |