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

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

Войти
Регистрация
Восстановить пароль
 
romex
45 / 45 / 4
Регистрация: 11.04.2010
Сообщений: 223
#1

Как избежать постоянных инициализаций временного объекта? - C++

03.10.2011, 18:17. Просмотров 655. Ответов 11
Метки нет (Все метки)

Здравствуйте!
Будет ли этот код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class my::testBuffer{ //код А
private:
  int data;
public:
  testBuffer(const int& d ) : data(d)
  {
  }
  int getData()
  {
    return data;
  }
  testBuffer operator++(int)
  {
    return testBuffer( data++ );
  }
};
Проигрывать этому
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class my::testBuffer{ //код Б
private:
  int data;
public:
  static testBuffer buffer;
  testBuffer(const int& d ): data(d)
  {
  }
  int getData()const
  {
    return data;
  }
  const testBuffer& operator++(int)
  {
    buffer=*this;
    data++;
    return buffer;
  }
};
my::testBuffer my::testBuffer::buffer(0);
?

Пытаюсь оптимизировать один из моих " проэктов ", изобилующий решениями как в А с большими классами. Быть может есть способ интереснее, чем Б?

Заранее спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.10.2011, 18:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как избежать постоянных инициализаций временного объекта? (C++):

Копирование из временного объекта - C++
1) Собственно, как работает такой конструктор? Хотелось бы какой-нибудь пример. 2) Сильно ли различаются по скорости new/notthrow...

время жизни временного объекта - C++
можно ли передать временный объект в функцию по ссылке? void f1(int & ); ..... int main() { f1(int());

Возвращение временного объекта из метода - C++
Доброго времени суток,господа! Сразу к делу: Имеется следующий код: struct Test { int a; //Lets just exist Test(){}...

Почему для временного безымянного объекта не вызывается оператор ()? - C++
Почему AddValue(value)(*pos); не вызывает operator()(int &elem) из класса AddValue? class AddValue { public: AddValue(int...

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

Как правильно вызывать функцию объекта из другой функции того же объекта? - C++
Доброго дня и ночи, уважаемые программисты! Существует некоторая проблема, на которую я наткнулся, решая задачу по программированию из...

11
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
03.10.2011, 18:20 #2
Никакой оптимизации не будет. Каждый раз buffer будет переопределяться. А в стеке он будет или в кучи роли никакой.
1
soft.creator
104 / 104 / 4
Регистрация: 17.10.2010
Сообщений: 283
03.10.2011, 18:21 #3
Насколько я знаю, нормальный компилятор способен убрать временный объект в варианте А.
Особенно с учетом того, что оператор ++, скорее всего, будет сгенерирован как inline.
1
romex
45 / 45 / 4
Регистрация: 11.04.2010
Сообщений: 223
03.10.2011, 18:21  [ТС] #4
Цитата Сообщение от gooseim Посмотреть сообщение
Никакой оптимизации не будет. Каждый раз buffer будет переопределяться. А в стеке он будет или в кучи роли никакой.
То есть на инициализацию не идет никаких затрат?
0
Teravisor
31 / 31 / 3
Регистрация: 07.08.2011
Сообщений: 89
03.10.2011, 18:25 #5
с включенными оптимизациями у компилятора между этими вариантами разницы нет, остальное зависит от контекста.

З.Ы.
Цитата Сообщение от soft.creator Посмотреть сообщение
Насколько я знаю, нормальный компилятор способен убрать временный объект в варианте А.
Особенно с учетом того, что оператор ++, скорее всего, будет сгенерирован как inline.
Я бы верил вот этому.
1
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
03.10.2011, 18:30 #6
romex, инициализация будет и там и там, в конструкторе класса.

Teravisor, не думаю, что 2й вариант компилятор сможет оптимизировать, потому что изменяется статическая переменная. Если он это оптимизирует, значит он не совсем умный.

Добавлено через 1 минуту
soft.creator правильно написал.
1
Teravisor
31 / 31 / 3
Регистрация: 07.08.2011
Сообщений: 89
03.10.2011, 18:30 #7
Цитата Сообщение от gooseim Посмотреть сообщение
Teravisor, не думаю, что 2й вариант компилятор сможет оптимизировать, потому что изменяется статическая переменная. Если он это оптимизирует, значит он не совсем умный.
Не заметил как buffer определяется, пардон.
В таком случае первое быстрее будет т.к. мы постоянно к статику обращаемся(зачем интересно даже?)
1
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
03.10.2011, 18:44 #8
Цитата Сообщение от romex Посмотреть сообщение
const int& d
это зачем? 4-х байт не хватает?
1
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
03.10.2011, 20:16 #9
romex, преждевременная оптимизация - зло.
0
romex
45 / 45 / 4
Регистрация: 11.04.2010
Сообщений: 223
04.10.2011, 07:59  [ТС] #10
Цитата Сообщение от silent_1991 Посмотреть сообщение
romex, преждевременная оптимизация - зло.
К сожалению это уже постоптимизация.
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
04.10.2011, 17:34 #11
romex, есть основания для оптимизации?
0
romex
45 / 45 / 4
Регистрация: 11.04.2010
Сообщений: 223
04.10.2011, 18:13  [ТС] #12
silent_1991, я могу скинуть тебе код, но надеюсь, что ты поверишь мне на слово - он действительно убог...

Оснований гора, и чем больше я читаю, тем сильнее это чувство. У меня игровой комп, но этот "проект" тормозит даже на нем. Anyway, теперь я понимаю, что нужно оптимизировать алгоритмы, а не пытаться перехитрить компилятор.
0
04.10.2011, 18:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.10.2011, 18:13
Привет! Вот еще темы с ответами:

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

Как избежать такую конструкцию? - C++
#include <iostream> #include <vector> class Foo { public: Foo() { x = 0; }

Как избежать ошибок линковщика? - C++
Я только-только начал изучать С++(Borland). Взял первый попавшийся пример из helpa - printf #include <stdio.h> #include <string.h> ...

Бесконечный цикл (как избежать?) - C++
Программа должна принимать только одно из трёх значений переменной 'destiny'. Если вводят любое другое значение, программа должна повторять...


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

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

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