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

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

Войти
Регистрация
Восстановить пароль
 
IvanPryamoy
247 / 1 / 1
Регистрация: 02.01.2013
Сообщений: 31
#1

Одинаковы ли оптимизации класса шаблон/константа? - C++

17.01.2013, 12:58. Просмотров 330. Ответов 7
Метки нет (Все метки)

Пусть у меня есть класс:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class MyClass{  
const long Flag;
public:
MyClass(const long Flag_V): Flag(Flag_V) {}
 
void MyFunc(){
switch (Flag){
case 1:
//что то делаем по сценарию 1
break;          
case 2:
//что то делаем по сценарию 2
break;                      
}}};
Равнозначно ли это по производительности (с учетом возможностей современных компиляторов) использованию шаблона вместо константы Flag?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template <long Flag> class MyClass{ 
public:
MyClass() {}
 
void MyFunc(){
switch (Flag){
case 1:
//что то делаем по сценарию 1
break;          
case 2:
//что то делаем по сценарию 2
break;                  
}}};
Дело в том, что в "шаблонном" варианте появляется новый тип данных, поэтому объекты невозможно подобрать в один массив для массовой работы с объектами (например, всем вызвать метод "MyFunc").

И где можно почитать про оптимизации компиляторов (у меня VisualStudio 2012)?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.01.2013, 12:58     Одинаковы ли оптимизации класса шаблон/константа?
Посмотрите здесь:

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

Шаблон класса (параметризация класса) - C++
Нужна помощь и советы!!! Англо-русский словарь построен как список. Каждая компонента содержит английское слово, соответствующее...

Создать шаблон некоторого класса, возможно, реализованного с применением некоторого серверного класса - C++
Добрый день, Уважаемые профессионалы. Прошу помочь в решении задачи. Честно говоря, я ничего не понимаю. И вот...решил...

Шаблон класса - C++
Здраствуйте! Разрабатываю динамический массив. Необходимо реализовать, а не знаю как..не хватает опыта... короче: есть шаблон класса. В...

Шаблон класса с++ - C++
StakNode.h #ifndef _STACKNODE_H_ #define _STACKNODE_H_ #include &lt;string&gt; template&lt;class T&gt; class Stack { ...

Шаблон класса - C++
Пытаюсь освоить использование шаблонов класса. Не получается скомпилировать проект, если определение шаблона и main() находятся в разных...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт С++
6552 / 3972 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
17.01.2013, 13:36     Одинаковы ли оптимизации класса шаблон/константа? #2
если Flag всегда известен на этапе компиляции и не меняется в рантайме то можно и без switch обойтись
IvanPryamoy
247 / 1 / 1
Регистрация: 02.01.2013
Сообщений: 31
17.01.2013, 14:08  [ТС]     Одинаковы ли оптимизации класса шаблон/константа? #3
Цитата Сообщение от Jupiter Посмотреть сообщение
если Flag всегда известен на этапе компиляции и не меняется в рантайме то можно и без switch обойтись
Пусть надо создать два объекта со значениями флага 1 и 2 соответственно (оба значения константы). Это известно на этапе компиляции. Но код-то без switch я все равно написать не смогу.
Igor3D
938 / 471 / 42
Регистрация: 01.10.2012
Сообщений: 2,331
17.01.2013, 14:42     Одинаковы ли оптимизации класса шаблон/константа? #4
Цитата Сообщение от IvanPryamoy Посмотреть сообщение
Пусть надо создать два объекта со значениями флага 1 и 2 соответственно (оба значения константы). Это известно на этапе компиляции. Но код-то без switch я все равно написать не смогу.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
template <long MyFlag> 
struct MyBaseClass {
// здесь общие методы не зависящие от MyFlag
};
 
struct MyClass1 : public  MyBaseClass <1> {
 void MyFunc( void )
 {
  ...
 }
};
 
struct MyClass2 : public  MyBaseClass <2> {
 void MyFunc( void )
 {
  ...
 }
};
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
17.01.2013, 14:44     Одинаковы ли оптимизации класса шаблон/константа? #5
Гарантированный dead code elimination и табличный switch:
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
25
26
27
28
29
30
31
32
33
34
35
namespace {
template <long Flag2>
struct MyFuncHelper {
    static void do_eet()
    {
        // ничего не делаем по дефолтному сценарию
    }
};
 
template <>
struct MyFuncHelper<1> {
    static void do_eet()
    {
        // что то делаем по сценарию 1
    }
};
 
template <>
struct MyFuncHelper<2> {
    static void do_eet()
    {
        // что то делаем по сценарию 2
    }
};   
}
 
template <long Flag> class MyClass { 
public:
    MyClass() {}
 
    void MyFunc()
    {
        MyFuncHelper<Flag>::do_eet();
    }
};
И ещё раз напомню: это спички по производительности. Вы больше времени потеряете на кривом алгоритме в MyFunc(), чем на этом.
IvanPryamoy
247 / 1 / 1
Регистрация: 02.01.2013
Сообщений: 31
17.01.2013, 15:15  [ТС]     Одинаковы ли оптимизации класса шаблон/константа? #6
Igor3D, Так вы два класса создали. Чем это отличается от первоначального варианта с шаблоном (где бы компилятор 100% вырезал ненужный код)?

Добавлено через 5 минут
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
И ещё раз напомню: это спички по производительности. Вы больше времени потеряете на кривом алгоритме в MyFunc(), чем на этом.
Так и в моем случае с шаблоном все отлично вырежется. Я же хотел уйти от шаблона класса, чтобы получить однотипные объекты. А тут все сохранилось как есть.

У меня будет просто добавление элемента в массив или его чтение. Для таких простых операций эти накладные расходы уже начинают играть роль.
Igor3D
938 / 471 / 42
Регистрация: 01.10.2012
Сообщений: 2,331
17.01.2013, 15:17     Одинаковы ли оптимизации класса шаблон/константа? #7
Цитата Сообщение от IvanPryamoy Посмотреть сообщение
Igor3D, Так вы два класса создали. Чем это отличается от первоначального варианта с шаблоном (где бы компилятор 100% вырезал ненужный код)?
Отличается отсутствием свитчей. Как уже говорили, те заботы об оптимизации "преувеличены". Здесь гораздо важнее удобство разработки. Допустим у Вас появилась еще одна реализация MyFunc() - и Вам придется колбасить старые классы наращивая switch. А так просто создаете новый класс
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.01.2013, 15:35     Одинаковы ли оптимизации класса шаблон/константа?
Еще ссылки по теме:

Шаблон класса - C++
Здравствуйте, необходимо реализовать шаблон структуры данных в памяти. Тип хранимого элемента – параметр шаблона. Шаблон может содержать...

Шаблон класса - C++
//файл T_Point_template.h //--------------------------------------------------------------------------- #ifndef T_Point_templateH ...

Шаблон класса - C++
Приветствую. Есть глупый вопрос. Имеется класс: #pragma once #include &quot;support.hpp&quot; template &lt;typename at&gt; class...

Шаблон класса. - C++
Приведите пожалуйста пример какого нибудь простого класса с меню. Чтобы пользователь сам вводил, а не компьютер заполнял.


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

Или воспользуйтесь поиском по форуму:
Jupiter
Каратель
Эксперт С++
6552 / 3972 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
17.01.2013, 15:35     Одинаковы ли оптимизации класса шаблон/константа? #8
Цитата Сообщение от IvanPryamoy Посмотреть сообщение
(где бы компилятор 100% вырезал ненужный код)?
готовы держать свечку?
ещё как вариант использовать препроцессор но это не тру
Yandex
Объявления
17.01.2013, 15:35     Одинаковы ли оптимизации класса шаблон/константа?
Ответ Создать тему
Опции темы

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