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

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

Восстановить пароль Регистрация
 
IvanPryamoy
247 / 1 / 1
Регистрация: 02.01.2013
Сообщений: 31
17.01.2013, 12:58     Одинаковы ли оптимизации класса шаблон/константа? #1
Пусть у меня есть класс:
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++ Создать шаблон некоторого класса, возможно, реализованного с применением некоторого серверного класса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 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
793 / 410 / 33
Регистрация: 01.10.2012
Сообщений: 2,070
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
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 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
793 / 410 / 33
Регистрация: 01.10.2012
Сообщений: 2,070
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++ Шаблон класса
Шаблон класса, параметром которого должны являться наследники определённого класса C++

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

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

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