LINUX.ORG.RU

недоиммутабельность

dave ★★★★★
()

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

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

Сейчас дефайн юзаю, если нужно что-то подобное

что, простите?

jtootf ★★★★★
()

по сравнению с чем? если с #define, ни в каких

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

Фигню сморозил, не обращайте внимания. У меня сейчас все внимание на собирающуюся генту отвлечено...

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

если аргумент передан как const, то может и возможен какой-то профит. Объявление метода как const в этом плане изофаллично

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

>Хороший способ сообщить об этом, сделать один из указателей const.

Вообще-то для этой цели существует restrict. const тут совершенно ни при чем.

Если топикстартеру охота оптимизации, то в gcc есть __attribute__((const)), который как раз для целей оптимизации и существует.

linuxfan
()
Ответ на: комментарий от annulen

>в С++ запрещен алиасинг указателей

Давно ли?

In C++, pointer arguments are assumed not to alias if they point to fundamentally different types («strict aliasing» rules).

linuxfan
()

К примеру в Qt на const-квалификаторе построены Implicitly Shared типы, когда разделение данных между экземплярами происходит только при мутабельной операции, другими словами когда сами данные изменяются - CoW (Copy on Write).

И, как уже сказали, const сильно повышает читабельность программ, позволяет писать самодокументируемый код и серьёзно минимизирует ошибки на этапе компиляции.

Dendy ★★★★★
()

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

Pantserovik
()

> В каких ситуациях (в плане оптимизации) можно извлечь пользу из применения const?

В оптимизации это насколько я знаю это не помогает никак. Повышается читабельность и «ошибкоустойчивость» написанной программы.

shelA
()

есть еще такой интересный эффект - вводить const'ы в код, где их не поставили обычно ооочень неприятно

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

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

Вы должны использовать модификатор const везде, где можно; это делает код более надежным, и часто компилятор не принимает код, который его не использует.

najar
()
for(int i = 0; i < list.size(); i++) {
    int value = list[i];
    ...
}

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

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

И к тому же, этот человек еще и срется по поводу С++, совершенно его не зная.

const помогает избежать ошибок и лишних копирований при CoW

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

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

Кстати, из-за const часто и возникают проблемы с многопоточностью - компилятор смело делает один вызов метода const, а далее использует уже полученное значение.

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

вот что имел в виду

 typedef std::list<int> int_list;

const int_list c_list = ...;

list* v_list = const_cast<int_list*>(&c_list);

for(int i = 0; i < c_list.size(); i++) { if( i % 4 == 0 ) v_list->remove_last(); }

и воля. программа упала

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

он не маленький

он жирный. и кормится С++ом только

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

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

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

>ну это я сократил. можно было сначала создать не констовый, потом от него взять констовую ссылку, и делать такое же
Да, хороший пример.

Booster ★★
()

const не для оптимизации, он нужен прежде всего для защиты и индикации не изменяемых в функции (методе) аргументов. Не использование const - признак редкостного быдлокодера.

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

Не правда О том, какие правила могут быть применены для оптимизации, говорится в стандарте (см. пример выше).

Хотя да, именно защита от кривых рук

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

const в нужных местах - один из показателей профессионализма человека, писавшего код.

Не согласен, это показатель того, что он не конченный быдлокодер (и то не факт).

erfea ★★★★★
()

Пример на COW:

#include <string>
#include <iostream>
 
#define N   10000000
 
int main()
{
    const std::string list[N];
    for(int i = 0; i != N; ++i)
        std::cout << list[i][0];
}

Если убрать const, выполняется ~вдвое дольше.

unsigned ★★★★
()

в тех же, где class и private :)

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

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

Что-то мне подсказывает, что дело не в константности метода size.

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

Ну а ты тогда просто конченый дебил.

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


Пиздец.

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

> О том, какие правила могут быть применены для оптимизации, говорится в стандарте

Пожалуйста, ткни меня носом в соответствующий параграф стандарта.

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

> Что-то мне подсказывает, что дело не в константности метода size.

ЧТо-то мне говорит, что именно в этом

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

> Ну а ты тогда просто конченый дебил.

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

Аргументировать вам слабо, я знаю

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

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

компилятор gcc 4.3.2, size вызывается на каждой итерации, ЧЯДНТ?

#include <iostream>

class C
{
public:
        C() {}
        int size() const
        {
                std::cout << "C::size called" << std::endl;
                return 8;
        }
};

int main(int argc, char** argv)
{
        const C c;

        for (int i = 0; i < c.size(); i++)
        {
                std::cout << "i = " << i << std::endl;
        }

        return 0;
}
dt1 ★★
()
Ответ на: комментарий от Manhunt

> Пожалуйста, ткни меня носом в соответствующий параграф стандарта.

Вот уж не помню, но там говорилось, что повторый const метод у объекта, у которого не было вызвано не const методы с момента последнего вызова const метода необязателен

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

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

Не правда ваша.

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