LINUX.ORG.RU

Ответ на: комментарий от namezys

А если размер массива изменится, а size (), как ты говорил один раз возьмется на цикл? Выход за границу получим?

panter_dsd ★★★★
()
Ответ на: комментарий от namezys

На объект безусловно, но достаточно и других. Просто так взять и вызывать метод один раз, это слишком большая вольность.

Booster ★★
()
Ответ на: комментарий от Booster

Если есть желание вызвать один раз, то делают так:

for (int i = 0, size = list.size (); i < size; i++)
panter_dsd ★★★★
()
Ответ на: комментарий от panter_dsd

> А если размер массива изменится, а size (), как ты говорил один раз возьмется на цикл? Выход за границу получим?

А как изменяется размер массива, если мы его не изменяли?

namezys ★★★★
()
Ответ на: комментарий от namezys

Если в цикле его изменить. Или другой поток. Только не говори, что при изменении контейнера, size еще раз вызовется.

panter_dsd ★★★★
()
Ответ на: комментарий от namezys

Так в том то и дело, что size это просто метод, для компилятора не существует никакого массива. И то что size, даже константный будет всегда возвращать одно число, компилятор гарантировать не в состоянии. Или он настолько интеллектуален, что способен отличать методы возвращающие размер массивов - классов?

Booster ★★
()
Ответ на: комментарий от panter_dsd

Если объект может быть изменен с другого потока и может коректно с этим работать, то он описывается как valotile и его методы тоже так описываются. Но таких методов мало

namezys ★★★★
()
Ответ на: комментарий от namezys

>const говорит о том, что если объект не изменен с последнего вызова - то он вернет тоже самое
Впервые о таком слышу.

Booster ★★
()
Ответ на: комментарий от najar

Позвольте процитировать А. Голуба:

во-первых, мнение какого-то Голуба мне до лампочки, меня интересуют факты; во-вторых, это не ответ на мой вопрос. что за красивые штуки можно вытворять с помощью const и перегрузки?

jtootf ★★★★★
()
Ответ на: комментарий от Booster

>> const говорит о том, что если объект не изменен с последнего вызова - то он вернет тоже самое

Впервые о таком слышу.

а я слышал это еще когда пришел сопливым программистом работать в abbyy. это приводилось как одна из ошибок программиста

namezys ★★★★
()
Ответ на: комментарий от namezys

>а я слышал это еще когда пришел сопливым программистом работать в abbyy. это приводилось как одна из ошибок программиста
Ткни в стандарт пожалуйста.

Booster ★★
()
Ответ на: комментарий от jtootf

во-первых, мнение какого-то Голуба мне до лампочки, меня интересуют факты; во-вторых, это не ответ на мой вопрос. что за красивые штуки можно вытворять с помощью const и перегрузки?

О красивых штуках говорил некто Gorthauer, а не я...

najar
()
Ответ на: комментарий от namezys

const говорит о том, что если объект не изменен с последнего вызова - то он вернет тоже самое

class Constant {
    public:
        int get() const { return rand(); }
};
unsigned ★★★★
()
Ответ на: комментарий от namezys

>если бы я его помнил наизусть. А так щас пытаюсь найти
Найди пожалуйста, а то оказывается у меня такой пробел, аж жутко стыдно стало.

Booster ★★
()
Ответ на: комментарий от namezys

а я слышал это еще когда пришел сопливым программистом работать в abbyy

то есть тебе это сказали, ты поверил и запомнил, но мозг напрячь поленился? поздравляю, сопливым программистом ты остался до сих пор

может всё-таки поищешь соответствующий пункт в стандарте?

jtootf ★★★★★
()
Ответ на: комментарий от Booster

Позже. 2-3 минуты копаний ничего не дали, кроме пары фраз о том, что объект, к которому применяются const операции считается неизменным

namezys ★★★★
()
Ответ на: комментарий от namezys

пока же из некоторых обсуждение в инете я нашел фразу: в стандарте нет ничего, что запрещало бы делать данную оптимизацию

namezys ★★★★
()
Ответ на: комментарий от namezys

оператор [] и size() - const. Значит size будет вызван один раз за весь цикл, а не list.size() раз

Тогда тут программа должна была бы упасть в корку:

std::vector<int> v(N);
for(size_t i = 0; i < v.size(); i++) { 
   if(some_condition) {
      std::swap(v[i], v.back());
      v.resize(v.size() - 1);
   }
} 
andreyu ★★★★★
()
Ответ на: комментарий от jtootf

что за красивые штуки можно вытворять с помощью const и перегрузки?

Ну, уже упомянутый C-o-W (его кусочек):

class string{
char const& operator[]()const;//const call, return const ref
charref operator[]();//non-const call, return charref
};

class charref{
operator char const&()const;//read
operator char&();//possible write, cuz copy
char& operator=(char);//copy and write
};
staseg ★★★★★
()
Ответ на: комментарий от unsigned

Хороший пример. Если верить namezys (пока нет ссылки на стандарт), то компиляторно-зависимый? Так?

dave ★★★★★
()
Ответ на: комментарий от namezys

> Мне как-то логика еще подсказывает, что именно такое поведение было бы правильно

Хреновая у вас логика.

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

> Тогда тут программа должна была бы упасть в корку:

Нет. resize точно нарушает констовость объекта. требуется перевызов однозначно

namezys ★★★★
()
Ответ на: комментарий от andreyu

Не только у меня. Похожие вопросы возникают (чуть покапался в инете). Ответ обычно стандартный: ничего не запрещает компилятору делать данную оптимизацию.

namezys ★★★★
()
Ответ на: комментарий от namezys

const говорит о том, что если объект не изменен с последнего вызова - то он вернет тоже самое

В стандарте говорится, что если метод класса X декларирован как const, то тип указателя this этого класса будет const X *

najar
()
Ответ на: комментарий от namezys

[<троллинг>] И поэтому на плюсах надо писать тем, кто прошел суровый курс хаскеля ;)

dave ★★★★★
()
Ответ на: комментарий от namezys

Если бы логика разработчиков компиляторов им подсказывала то же самое, то не работало бы ни одной нормальной программы.

const T t;
extern bool print_T(const T&) const;
while (true) {
   if (!print_T(t)) {
      // Crazy error message
   }
}

в print_T t - const, значит он не изменился, значит результат тот же? То есть t будет напечатан один раз?

rymis ★★
()
Ответ на: комментарий от rymis

нет. это для методов только

хотя замечание о побочных действиях тоже важны, вроде в const методах их не должно быть

namezys ★★★★
()
Ответ на: комментарий от namezys

const в методах указывает только на то, что он не изменяет данных класса (кроме mutable). И ни в коем случае не говорит компилятору, что возвращаемое значение постоянно. Учи матчасть.

panter_dsd ★★★★
()
Ответ на: комментарий от namezys

замечание о побочных действиях тоже важны, вроде в const методах их не должно быть

в C++ нет контроля за побочными действиями. никакого

jtootf ★★★★★
()
Ответ на: комментарий от Kosyak

> const int size() const не пробовали?

Для проверки я сделал именно такой метод. Компилятор gcc, оптимизация -O2 и -O3 - вызывается каждую итерацию. Что вполне логично.

andreyu ★★★★★
()
Ответ на: комментарий от namezys

Суть не в const-методе, а в том, что он конкретно в вашем случае был ещё и inline. Естесственно компилятор после его разворачивания может применить оптимизации, если заренее знает, что метод возвращает поле const-данных.

Dendy ★★★★★
()
Ответ на: комментарий от panter_dsd

const ни на что не указывает вообще. Ничего тебе не мешает написать ((MyClass*) this)->a = 1; в константом методе. И это будет работать, и это будет на 100% корректный С++. Как уже сказали, это просто форма документации программ.

То, про что говорит товарищ nemezys, называется inline functino и вынесение инвариантов из цикла, и const тут компилятору не поможет никак абсолютно. Т.е. без const он это сделает точно так же.

Legioner ★★★★★
()
Ответ на: комментарий от alex_custov

> была когда-то тема, что такая конструкция оптимизируется не всеми компиляторами, даже gcc разными версиями.

Так вы мне скажите, валидна ли конструкция ниже?

std::vector<int> v(N);

for(size_t i = 0; i < v.size(); i++) {
   if(some_condition) {
      std::swap(v[i], v.back());
      v.resize(v.size() - 1);
   }
}
andreyu ★★★★★
()
Ответ на: комментарий от Legioner

> Ничего тебе не мешает написать ((MyClass*) this)->a = 1; в константом методе

1. для этого есть mutable
2. не зря же есть -Wcast-qual + куча других опций, у меня, например, варнинги все включены + pedantic + многие что не вошли в All + pedantic + Werror

ahonimous
()
Ответ на: комментарий от Legioner

вообще если ты работаешь с указателями и С style cast - то тебе вообще ничего не гарантиуреся

namezys ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.