оптимизация конст. переменных, циклов
От: prog123 Европа  
Дата: 22.03.17 20:33
Оценка: :)
Столкнулся с интересной фичей/багом. В следующем примере кода цикл не выполняется из-за того, что случайно объявил переменную константной.
windows, mingw, gcc 4.9.2

#include <iostream>
#include <cassert>

// замена реальной ф-ции для примера,только для целых
int readRawData(char* buffer, size_t size)
{
    assert(size == 4);
    *((int*)buffer) = 10;
    return 4;
}

int main(int argc, char *argv[])
{
    int const blockCount = 0;  // если const, то цикл ниже не выполняется. если убрать const, все норм

    //stream.readRawData((char*)&blockCount, sizeof(blockCount))  // реальная ф-ция
    readRawData((char*)&blockCount, sizeof(blockCount));          // замена для примера

    for(int i = 0; i < blockCount; ++i)                  // в отладчике blockCount = 10, но цикл не выполняется, он выкинут при компиляции
        std::cout << i << " ";                      // здесь должно печататься 0 1 2 3 ... 9 но не печатается ))
    std::cout << std::endl;

    return 0;
}
Re: оптимизация конст. переменных, циклов
От: niXman Ниоткуда https://github.com/niXman
Дата: 22.03.17 20:48
Оценка: 1 (1) +4
не знаю, баг или фитча, но мне такое поведение компилятора определенно нравится! =)
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: оптимизация конст. переменных, циклов
От: watchmaker  
Дата: 22.03.17 20:49
Оценка: 5 (1) +3
Здравствуйте, prog123, Вы писали:

P>Столкнулся с интересной фичей/багом.

Ну да, в твоём коде баг (не назвал бы его правда интересным).
А чтобы отлавливать такие ошибки на этапе компиляции придумали reinterpret_cast:
readRawData(reinterpret_cast<char*>(&blockCount), sizeof(blockCount));
Вот его и нужно во всём подобном коде использовать.
Re: оптимизация конст. переменных, циклов
От: andyp  
Дата: 22.03.17 20:50
Оценка: 1 (1) +2
Здравствуйте, prog123, Вы писали:

P>Столкнулся с интересной фичей/багом. В следующем примере кода цикл не выполняется из-за того, что случайно объявил переменную константной.

P>windows, mingw, gcc 4.9.2


С компилятора взятки гладки.Ты ж сам обещал, что не будешь менять счетчик, написав const, и поменял. Он вполне в этом месте constant propagation использовать вправе.
Re: оптимизация конст. переменных, циклов
От: Erop Россия  
Дата: 22.03.17 22:35
Оценка: +3
Здравствуйте, prog123, Вы писали:

P>Столкнулся с интересной фичей/багом.

Это не бага, это ты плохо понимаешь, что такое const
Автор: Erop
Дата: 04.09.07
...

Вот то ли дело в древних FORTRAN'ах... Там даже литеральные константы хранились в ячейках памяти, и если такую ячейку изменить, то все 2-ки в программе могли внезапно стать 3-ками, например
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: оптимизация конст. переменных, циклов
От: Privalov  
Дата: 23.03.17 07:17
Оценка: +1 :)
Здравствуйте, Erop, Вы писали:

E>Вот то ли дело в древних FORTRAN'ах... Там даже литеральные константы хранились в ячейках памяти, и если такую ячейку изменить, то все 2-ки в программе могли внезапно стать 3-ками, например


В новых, слышал, тоже можно. Правда, на современных ОС валиться при выполнении будет.
Re: оптимизация конст. переменных, циклов
От: Mr.Delphist  
Дата: 24.03.17 11:24
Оценка:
Здравствуйте, prog123, Вы писали:

P>Столкнулся с интересной фичей/багом. В следующем примере кода цикл не выполняется из-за того, что случайно объявил переменную константной.


Подозреваю, что если вынести blockCount в глобальный скоуп, то в "неоптимизированном" коде можно огрести от memory protection — глобальные константы кладутся в read-only секции.

В общем, код — хороший пример того, как делать можно, но не нужно
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.