powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / возможности switch()
65 сообщений из 65, показаны все 3 страниц
возможности switch()
    #39754115
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Допустима ли подобная хрень перед метками?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
int z;
switch(x) {
   int y=67; z=y*x; .....

    case 1 : cout << x
    case 2 : cout << x
}


Кто-нибудь использовал? Какая в этом особенная надобность?
...
Рейтинг: 0 / 0
возможности switch()
    #39754117
semen.s.semen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exp98Какая в этом особенная надобность?

Спросить Вас на интервью и если не знаете урезать ЗП ;)))
...
Рейтинг: 0 / 0
возможности switch()
    #39754128
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exp98Допустима ли подобная хрень перед метками?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
int z;
switch(x) {
   int y=67; z=y*x; .....

    case 1 : cout << x
    case 2 : cout << x
}


Кто-нибудь использовал? Какая в этом особенная надобность?
Это компилируется? В хэлпе про такое не написано.
...
Рейтинг: 0 / 0
возможности switch()
    #39754151
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

написано - это обычный statement - aka блок кода, только со спец метками case etc

т.е можно
...
Рейтинг: 0 / 0
возможности switch()
    #39754173
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglDima T,

написано - это обычный statement - aka блок кода, только со спец метками case etc

т.е можно
Не компилируется
Код: plaintext
1.
2.
3.
4.
5.
6.
	int x = 10;
	switch (x) {
		int y = 15;
	case 10:
		std::cout << x;
	}


Код: plaintext
error C2360: initialization of 'y' is skipped by 'case' label

MSVC 2017
...
Рейтинг: 0 / 0
возможности switch()
    #39754180
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exp98,

Ну не в таком прямо виде, но используется иногда.
Например: https://en.wikipedia.org/wiki/Duff's_device
Ну или во всяких автоматах состояний.

Dima T,

В С можно. В С++ наверно тоже.
...
Рейтинг: 0 / 0
возможности switch()
    #39754198
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyDima T,

В С можно. В С++ наверно тоже.
MSVC17 (C++) не компилирует 21775208
...
Рейтинг: 0 / 0
возможности switch()
    #39754203
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyНапример: https://en.wikipedia.org/wiki/Duff's_device

Капец
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
    register n = (count + 7) / 8;
    switch (count % 8) {
    case 0: do { *to = *from++;
    case 7:      *to = *from++;
    case 6:      *to = *from++;
    case 5:      *to = *from++;
    case 4:      *to = *from++;
    case 3:      *to = *from++;
    case 2:      *to = *from++;
    case 1:      *to = *from++;
            } while (--n > 0);
    }


Не перестаю удивляться сколько извращений позволяет С
...
Рейтинг: 0 / 0
возможности switch()
    #39754220
semen.s.semen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TAnatoly MoskovskyНапример: https://en.wikipedia.org/wiki/Duff's_device

Капец
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
    register n = (count + 7) / 8;
    switch (count % 8) {
    case 0: do { *to = *from++;
    case 7:      *to = *from++;
    case 6:      *to = *from++;
    case 5:      *to = *from++;
    case 4:      *to = *from++;
    case 3:      *to = *from++;
    case 2:      *to = *from++;
    case 1:      *to = *from++;
            } while (--n > 0);
    }


Не перестаю удивляться сколько извращений позволяет С

Нормальное ревью такой код не пропустит
...
Рейтинг: 0 / 0
возможности switch()
    #39754226
a.guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
exp98Допустима ли подобная хрень перед метками?Смотря насколько подобная. Как в последующем коде — не допустима.
...
Рейтинг: 0 / 0
возможности switch()
    #39754228
a.guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyВ С можно. В С++ наверно тоже.В C можно, в C++ не можно.
...
Рейтинг: 0 / 0
возможности switch()
    #39754260
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a.guestAnatoly MoskovskyВ С можно. В С++ наверно тоже.В C можно, в C++ не можно.
"C отстал и никогда не получит фишек C++"
это фактически цитата Страуса
...
Рейтинг: 0 / 0
возможности switch()
    #39754298
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exp98Какая в этом особенная надобность?
Только если зачем-то ограничить область видимости для y. Других не вижу.
...
Рейтинг: 0 / 0
возможности switch()
    #39754405
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TAnatoly MoskovskyНапример: https://en.wikipedia.org/wiki/Duff's_device

Капец
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
    register n = (count + 7) / 8;
    switch (count % 8) {
    case 0: do { *to = *from++;
    case 7:      *to = *from++;
    case 6:      *to = *from++;
    case 5:      *to = *from++;
    case 4:      *to = *from++;
    case 3:      *to = *from++;
    case 2:      *to = *from++;
    case 1:      *to = *from++;
            } while (--n > 0);
    }


Не перестаю удивляться сколько извращений позволяет С

Почему-то вспомнился цикл Дейкстры.
...
Рейтинг: 0 / 0
возможности switch()
    #39754506
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух"C отстал и никогда не получит фишек C++"
это фактически цитата Страуса
Наличие рудиментов синтаксиса С никак не отменяют сути этой фразы.
А суть в том, что С остался ассемблером как и задумывался, где программист должен все писать руками - т.е. без фишек )).
...
Рейтинг: 0 / 0
возможности switch()
    #39754583
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
semen.s.semen, послушать Вас, тут всем надо з\п урезать, кроме Siemargl.
Anatoly Moskovsky, офигительный пример!

Ну скажм, пример я от фонаря привёл.
Siemarglнаписано - это обычный statement - aka блок кода, только со спец метками case etcПоэтому и спросил.
авторMSVC17 (C++) не компилирует И поэтому тоже.
Не так давно захотелось выпендрится при доработке - именно перед метками, но билдер2009 не пропустил. Вренее, скомпилировал, но в работе игнорировал. Тогда похерил, а сейчас вспомнил и спросил для ради развития.

А так компилится и работает в Си11 и в ++11 в mingw6.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
int main(int argc, char** argv) {
    int z,x;
    switch(x) {
       int y; y=67; z=y*x; 
        case 1 :  x=3;
        case 2 :  x=4;
    }
    return 0;
}
...
Рейтинг: 0 / 0
возможности switch()
    #39760555
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TНе перестаю удивляться сколько извращений позволяет С

Фичи не извращения, они помогают сэкономить время на чашечку кофе
...
Рейтинг: 0 / 0
возможности switch()
    #39760570
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гирлионайльдо...помогают сэкономить время..

????
с точки зрения производства софта - чем больше закос на не стандартное-специфичное-заумное-или_бестолково_исполненное - тем меньше ценности такой код представляет.

Помню в том веке за одним работничком давали мы премию, за приведение кода к кодинг-рулесу. Он любил уже оттестированный готовый код паковать визуально в КВАДРАТ. Наверное так-же исходил из того, что прокручивать отпадает необходимость - "економия"


удачи вам, она Вам потребуется
(круглый)
ЗЫ
производство - не только работает и забыли, если что..
ЗЫ ЗЫ
Хороший тест на проф НЕ пригодность однака. Если человек без запинки на такую загогулину отвечает - работать будет = плохой программист.
...
Рейтинг: 0 / 0
возможности switch()
    #39760580
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это чортов code-smell и если SonarQube или PVS ничего не выругался - то следует немедленно
фиксить правила которые проверяют стиль кода.

Ну а разработчику которые такое пишет надо отрубить пальцы и стерилизовать чтоб не размножался.

P.S. Кстати где этот хвастун который PVS рекламировал...
...
Рейтинг: 0 / 0
возможности switch()
    #39760597
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНу а разработчику которые такое пишет надо отрубить пальцы и стерилизовать чтоб не размножался.я бы не был так категоричен, потому что программист должен расти и жить в творческой среде. Знать и понимать, почему можно сделать так или как-то ещё, и/или почему так делать не надо или нельзя. Придумывать свои варианты решения и находить их сильные и слабые стороны.
А иначе вы получите человека, который мыслит паттернами, знает много умных слов, но быстро садится в лужу при нетривиальной задаче. Вот таких стоит обрубать.
maytonP.S. Кстати где этот хвастун который PVS рекламировал...ну они странные немного
...
Рейтинг: 0 / 0
возможности switch()
    #39760615
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я говорю о разработке в команде. Закодил какашку - получи люлей от коллег.

Ну а в своём личном гитхабе - занимайся творчеством.
...
Рейтинг: 0 / 0
возможности switch()
    #39760667
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exp98Не так давно захотелось выпендрится при доработке - именно перед метками, но билдер2009 не пропустил. Вренее, скомпилировал, но в работе игнорировал. Тогда похерил, а сейчас вспомнил и спросил для ради развития.Не надо выпендриваться! Надо писать просто, понятно и лаконично, чтобы никто при изучении кода не чертыхался, не переделывал за тобой и чтобы ты сам, вернувшись к коду через год, другой сразу понял зачем ты это написал.

exp98А так компилится и работает в Си11 и в ++11 в mingw6.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
int main(int argc, char** argv) {
    int z,x;
    switch(x) {
       int y; y=67; z=y*x; 
        case 1 :  x=3;
        case 2 :  x=4;
    }
    return 0;
}

Это вообще бредятина. Независимо от того, что прилетит в "x", результатом "x" будет либо то, что прилетело, либо "4".
...
Рейтинг: 0 / 0
возможности switch()
    #39760999
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev, бред, да, поскольку от фонаря написано.
Верно то, что перед метками не будет работать подобно конструктору. А именно это меня тогда, в билдере, и заинтересовало: для чего думаю, оставили возможность что-то написать между свитч и кэйсом, дай-ка проверю. Но не вышло.
Зато можно
Код: plaintext
1.
case abcde: go to выше;


а там выполнить что-нить полезное и на другую метку перейти.

Правда нафига? Зато пример Duff's впечатлил тем, что можно в цикл войти не через начало.
...
Рейтинг: 0 / 0
возможности switch()
    #39761019
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Некоторые господа в декларацию for-цикла включали тело. По приколу.
...
Рейтинг: 0 / 0
возможности switch()
    #39761185
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, и иже выше.

вы не понимаете логики.

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

не приписывайте чертовщину - ее тут нет
...
Рейтинг: 0 / 0
возможности switch()
    #39761191
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl,

Пропустишь такое через review?
...
Рейтинг: 0 / 0
возможности switch()
    #39761195
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonSiemargl,

Пропустишь такое через review?Чтобы не выглядеть умным, я лучше на днях посмотрю, что пишут профи в МИСРА С++ итп =)
...
Рейтинг: 0 / 0
возможности switch()
    #39761205
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вот взял какой-то свой старый кусок кода. И сделал несколько нейтральных преобразований.
Скобки там... namespaces. Логика сохранена но какие-то элементы читаемости утеряны.
Попробуйте не компилируя и не запуская прокомментировать что здесь и как происходит.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
       int cnt = 000;
	for(int i=000;i<=077;i+=01) {{
          for(int i=000;i<=1;i+=01)            
            i::i=000;
	    for(;!(i::i>077);){
                printf("count = %i, i=%o, i=%o, i=%o, i=%o  \n", cnt, i >> 3 , i % 010, i::i / 010, i::i % 010);
                i::i+=01;
                cnt+=01;
            }    
        }}
...
Рейтинг: 0 / 0
возможности switch()
    #39761208
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, ты полагаешь, восьмеричная система счисления кого-то сильно смутит? :)

Предлагаю расставить все точки над "i" :\
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
int cnt = 000;
for(int i=000;i<=077;i+=01)
{
  {  //-- Назачем? ><
    for(int i=000;i<=1;i+=01) i::i=000;  // -- Зачем здесь этот цикл? Бессмыслица... Достаточно лишь i::i = 0
    for(;!(i::i>077);)  // -- Выполнится 64*64 раза, приращение внутри цикла
    {
      printf("count = %i, i=%o, i=%o, i=%o, i=%o  \n", cnt, i >> 3 , i % 010, i::i / 010, i::i % 010);
      i::i+=01;
      cnt+=01;
    }    
  }
}
...
Рейтинг: 0 / 0
возможности switch()
    #39761210
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кого-то switch смущал.

Но синтаксические конфеты switch легко проверяются. В 1 запуск с отладкой.

Циклы поверить сложнее. Больше условий надо учесть.
...
Рейтинг: 0 / 0
возможности switch()
    #39761542
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglmaytonSiemargl,

Пропустишь такое через review?Чтобы не выглядеть умным, я лучше на днях посмотрю, что пишут профи в МИСРА С++ итп =)
Запрещено в MISRA C - недостижимый код до 1й метки
...
Рейтинг: 0 / 0
возможности switch()
    #39761544
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglSiemarglпропущено...
Чтобы не выглядеть умным, я лучше на днях посмотрю, что пишут профи в МИСРА С++ итп =)
Запрещено в MISRA C - недостижимый код до 1й метки
Слава богу. Я уж думал там совсем языковая анархия.
...
Рейтинг: 0 / 0
возможности switch()
    #39762194
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonСлава богу. Я уж думал там совсем языковая анархия.Отсутствие языковой анархии проблем в коде не решает. Моё личное мнение: оно (отсутствие) их добавляет.
...
Рейтинг: 0 / 0
возможности switch()
    #39762251
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А кто нить попробуйте аналогичную штуку в шарпах. Мне кажется мы должны получить ошибку компилляции.
...
Рейтинг: 0 / 0
возможности switch()
    #39762408
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА кто нить попробуйте аналогичную штуку в шарпах. Мне кажется мы должны получить ошибку компилляции.
Так и есть. Нельзя там код вставлять между switch() и case. C# switch()
...
Рейтинг: 0 / 0
возможности switch()
    #39762440
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Java тоже нельзя. Нарушение синтаксиса.
...
Рейтинг: 0 / 0
возможности switch()
    #39762562
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0,

А код, очень понятен! Прозрачен, как твои пластиковые окна (А грязь на них - глупый коллектив. Который нужно постоянно в саки макать из за некомпетентности)

Давай разберём, почему это фича, а не говно - код

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    register n = (count + 7) / 8; // Определим, сколько нужно циклов по 8 в строке

    switch (count % 8) { // Изначально, у нас может быть 10 символов 8 и 2 символа. Что ровно 10 % 8 = 2
    case 0: do { *to = *from++;
    case 7:      *to = *from++;
    case 6:      *to = *from++;
    case 5:      *to = *from++;
    case 4:      *to = *from++;
    case 3:      *to = *from++;
    case 2:      *to = *from++;  << Сюда, мы прыгнем сразу - же! Что бы убрать остаток 
    case 1:      *to = *from++;
            } while (--n > 0); // Теперь, прогоним оставшейся 8+ символов, если они имеются по формуле (count + 7) / 8 
    }



А теперь представь, что без данной фичи, нам надо развернуть цикличный цикл
Код: plaintext
1.
2.
    while (--count >= 0)
        *to++ = *from++;



Что значит, при каждом проходе, у нас есть проверка X >= 0 когда она существует в том коде раз в 8 тактов

Конечно же, умные компиляторы которые сейчас есть, поймут что пользователь делает данный код, и вставит свою реализацию move

А вот древние компиляторы такого не умели. И процессоры были другие, и на то время код с фичей такой считался очень быстрым

.. А сейчас же, во всех процессорах по стандарту идёт SSE и он вставит скорее её. И прирост будет огромный как хер подзаборный
...
Рейтинг: 0 / 0
возможности switch()
    #39762563
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, данную фичу можно применять, но не в переносе строк в другую. А для чего нибудь другого, что требует такую же логику обработки. Но не может за раз перенести не 8 не 4 не 2 байта )))) xD
...
Рейтинг: 0 / 0
возможности switch()
    #39762695
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если речь идет о копировании строк то данный шаблон скорее не применяется.
...
Рейтинг: 0 / 0
возможности switch()
    #39762703
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гирлионайльдо..коллектив. ..из за некомпетентности..

ну, судя по коду - писал его лох от сей.
1) использование констант в коде +1 шаг к увольнению.
2) если надо использовать скорость копирования, то откройте для себя стандартные функции библиотек (и как они решают эти дела. тут надо бы сказать про ту обезьяну которая не использует опыт человечества ранее накопленный) +10 шагов к увольнению, с записью в трудовую о не компетентности в данной области
3) время сколько затратит другой разработчик который заглянет в этот код? 5 секунд? 5 минут? Или 30 минут лазанья по компиляторам, с проверкой - а что хотел автор, правильно ли они превращают идею автора в результат, как это адаптировать к другим условиям которые пришли с выше... +5 шагов к увольнению организатора работ к допуску этого горе программиста к коду.
4) ... там ышо можно наковырять существенные минусы этого говнокода...

удачи вам, она вам потребуется
(круглый)
...
Рейтинг: 0 / 0
возможности switch()
    #39762708
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Метрика Холстеда покажет небольшое число. Но сложность этого кода - в нестандартом оформлении.
Это такой себе brain-fuck для собеседований. Не для production кода.
...
Рейтинг: 0 / 0
возможности switch()
    #39762722
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok01) использование констант в коде +1 шаг к увольнению.
Это очень смешное замечание в применении к данному примеру кода.
Пример того как не вдумываясь буквально применяют правила ))
...
Рейтинг: 0 / 0
возможности switch()
    #39762725
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quote Anatoly Moskovsky]kolobok0...не вдумываясь буквально применяют правила ))

Вы правы и не правы одновременно.
В плане форума - да, важнее не это.
В плане кода - тот кто писал, не открывал альма-матер C&R

для хэллоу ворда - это не заметно. на больших проектах это задница.
(круглый)
...
Рейтинг: 0 / 0
возможности switch()
    #39762729
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0,

Ну перепишите без констант - посмотрим на читаемость ))
...
Рейтинг: 0 / 0
возможности switch()
    #39762736
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да разве в константах дело. Скажите по честному кто помнит порядок срабатывания метки case 0: и начала цикла с постусловием do?

Я без проверки на 2-3 компилляторах не скажу что и как.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    register n = (count + 7) / 8; // Определим, сколько нужно циклов по 8 в строке

    switch (count % 8) { // Изначально, у нас может быть 10 символов 8 и 2 символа. Что ровно 10 % 8 = 2
    case 0: do { *to = *from++;
    case 7:      *to = *from++;
    case 6:      *to = *from++;
    case 5:      *to = *from++;
    case 4:      *to = *from++;
    case 3:      *to = *from++;
    case 2:      *to = *from++;  << Сюда, мы прыгнем сразу - же! Что бы убрать остаток 
    case 1:      *to = *from++;
            } while (--n > 0); // Теперь, прогоним оставшейся 8+ символов, если они имеются по формуле (count + 7) / 8 
    }
...
Рейтинг: 0 / 0
возможности switch()
    #39762757
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДа разве в константах дело. Скажите по честному кто помнит порядок срабатывания метки case 0: и начала цикла с постусловием do?
Метка это адрес кода, который идет после нее. Т.е. case 0 это адрес начала цикла do.
...
Рейтинг: 0 / 0
возможности switch()
    #39762773
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То же самое по скорости (в оригинале упор на скорость), проигрыш в размере. читаемость 100%

Код: plaintext
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.
register n = count / 8;

while (n-- > 0)
{
  *to = *from++;
  *to = *from++;
  *to = *from++;
  *to = *from++;
  *to = *from++;
  *to = *from++;
  *to = *from++;
  *to = *from++;
}

switch (count % 8)
{
case 7:
  *to = *from++;
case 6:
  *to = *from++;
case 5:
  *to = *from++;
case 4:
  *to = *from++;
case 3:
  *to = *from++;
case 2:
  *to = *from++;
case 1:
  *to = *from++;
case 0:
  break;
}
...
Рейтинг: 0 / 0
возможности switch()
    #39762794
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гирлионайльдо...
...надо развернуть цикличный цикл
Код: plaintext
1.
2.
    while (--count >= 0)
        *to++ = *from++;



...


Вы даже не в ту степь пример привели. Изначально сбив меня с панталыку. Обратите внимание, что в оригинальной статье нет приращение указателя приёмника. И дано объяснение, что это указатель на ячейку вывода в адресном пространстве. И этот нюанс накладывает ограничения к применению станадартных либ по копированию.
Ваш же пример - решает стандартная библиотека копирования. Общий схематоз - узнаём сколько больших блоков можем за "один шаг" копирнуть, копируем большие блоки. Далее добиваем мелочёвкой.

(круглый)
...
Рейтинг: 0 / 0
возможности switch()
    #39762796
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0То же самое по скорости (в оригинале упор на скорость), проигрыш в размере. читаемость 100%
Насчитал столько же констант ))
...
Рейтинг: 0 / 0
возможности switch()
    #39762802
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДа разве в константах дело. Скажите по честному кто помнит порядок срабатывания метки case 0: и начала цикла с постусловием do?

Так понятнее? ))

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
    switch (count % 8) {
    case 0:
        do {
            *to = *from++;
            case 7:
            *to = *from++;
            case 6:
            *to = *from++;
            case 5:
            *to = *from++;
            case 4:
            *to = *from++;
            case 3:
            *to = *from++;
            case 2:
            *to = *from++;
            case 1:
            *to = *from++;
        } while (--n > 0);
    }
...
Рейтинг: 0 / 0
возможности switch()
    #39762842
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky...Насчитал столько же констант ))

ну вот не правда Ваша - семёрки нема :))

ну вот чтоб не возбуждать лишний раз другой вектор - не стал рожать.
...
Рейтинг: 0 / 0
возможности switch()
    #39762897
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskymaytonДа разве в константах дело. Скажите по честному кто помнит порядок срабатывания метки case 0: и начала цикла с постусловием do?

Так понятнее? ))

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
    switch (count % 8) {
    case 0:
        do {
            *to = *from++;
            case 7:
            *to = *from++;
            case 6:
            *to = *from++;
            case 5:
            *to = *from++;
            case 4:
            *to = *from++;
            case 3:
            *to = *from++;
            case 2:
            *to = *from++;
            case 1:
            *to = *from++;
        } while (--n > 0);
    }


Уже лучше. Только странно что *to не инкременируется.
...
Рейтинг: 0 / 0
возможности switch()
    #39762913
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonТолько странно что *to не инкременируется.
to - это порт В/В
...
Рейтинг: 0 / 0
возможности switch()
    #39762920
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да в коде вообще нет константан! Казнить, не помиловать! Дилетанта

Ибо сейчас все пользователи WinApi - Curl и другого просто побледнели. Это что получается, им нужно цифорки запоминать???

Модератор: Редактировано

Вот так выглядит код, если его привести к c\c++

Код: plaintext
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.
// Example program
#include <iostream>
#include <string>

void send(char* to, const char * from,  int count)
{
    int n = (count + 7) / 8;
    switch (count % 8) {
    case 0: do { *to++ = *from++; // Всё, данная метка никак не относится к switch
    case 7:      *to++ = *from++;
    case 6:      *to++ = *from++;
    case 5:      *to++ = *from++;
    case 4:      *to++ = *from++;
    case 3:      *to++ = *from++;
    case 2:      *to++ = *from++;
    case 1:      *to++ = *from++;
            } while (--n > 0);
    }
}


int main()
{
    char dd[] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
    char xx[] = "000000000000000000000000000000000000000000000";
  send(dd,xx, 18 );  
    

  std::cout << dd << "!\n";
}

...
Рейтинг: 0 / 0
возможности switch()
    #39762924
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0То же самое по скорости (в оригинале упор на скорость), проигрыш в размере. читаемость 100%

Код: plaintext
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.
register n = count / 8;

while (n-- > 0)
{
  *to = *from++;
  *to = *from++;
  *to = *from++;
  *to = *from++;
  *to = *from++;
  *to = *from++;
  *to = *from++;
  *to = *from++;
}

switch (count % 8)
{
case 7:
  *to = *from++;
case 6:
  *to = *from++;
case 5:
  *to = *from++;
case 4:
  *to = *from++;
case 3:
  *to = *from++;
case 2:
  *to = *from++;
case 1:
  *to = *from++;
case 0:
  break;
}



Тесты в студию! С 10000000 вызовами

Хотя если ты не подметил, что подметили сверху. То ты и код то не запускал
...
Рейтинг: 0 / 0
возможности switch()
    #39762929
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И что бы закрепить, что делает код, вам ASM листинг

https://godbolt.org/z/bN7U43
Код: sql
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.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
send(char*, char const*, int):                          # @send(char*, char const*, int)
        push    EBX
        push    ESI
        mov     EAX, DWORD PTR [ESP + 20]
        mov     ECX, EAX
        sar     ECX, 31
        shr     ECX, 29
        add     ECX, EAX
        and     ECX, -8
        mov     ESI, EAX
        sub     ESI, ECX
        cmp     ESI, 7
        ja      .LBB0_11
        lea     ECX, DWORD PTR [EAX + 7]
        sar     ECX, 31
        shr     ECX, 29
        lea     EAX, DWORD PTR [EAX + ECX + 7]
        sar     EAX, 3
        mov     ECX, DWORD PTR [ESP + 16]
        mov     EDX, DWORD PTR [ESP + 12]
        jmp     DWORD PTR [4*ESI + .LJTI0_0]
.LBB0_2:
        mov     BL, BYTE PTR [ECX]
        mov     BYTE PTR [EDX], BL
        inc     ECX
        inc     EDX
.LBB0_3:
        mov     BL, BYTE PTR [ECX]
        mov     BYTE PTR [EDX], BL
        inc     ECX
        inc     EDX
.LBB0_4:
        mov     BL, BYTE PTR [ECX]
        mov     BYTE PTR [EDX], BL
        inc     ECX
        inc     EDX
.LBB0_5:
        mov     BL, BYTE PTR [ECX]
        mov     BYTE PTR [EDX], BL
        inc     ECX
        inc     EDX
.LBB0_6:
        mov     BL, BYTE PTR [ECX]
        mov     BYTE PTR [EDX], BL
        inc     ECX
        inc     EDX
.LBB0_7:
        mov     BL, BYTE PTR [ECX]
        mov     BYTE PTR [EDX], BL
        inc     ECX
        inc     EDX
.LBB0_8:
        mov     BL, BYTE PTR [ECX]
        mov     BYTE PTR [EDX], BL
        inc     ECX
        inc     EDX
.LBB0_9:
        mov     BL, BYTE PTR [ECX]
        mov     BYTE PTR [EDX], BL
        dec     EAX
        test    EAX, EAX
        jle     .LBB0_11
        inc     ECX
        inc     EDX
        jmp     .LBB0_2
.LBB0_11:
        pop     ESI
        pop     EBX
        ret
.LJTI0_0:
        .long   .LBB0_2
        .long   .LBB0_9
        .long   .LBB0_8
        .long   .LBB0_7
        .long   .LBB0_6
        .long   .LBB0_5
        .long   .LBB0_4
        .long   .LBB0_3

...
Рейтинг: 0 / 0
возможности switch()
    #39762930
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно заметить, что при 8 тактов нет не одной проверки. Что даёт огромный прирост в те времена
...
Рейтинг: 0 / 0
возможности switch()
    #39762936
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гирлионайльдо, Луговский? Залогонься друг!
...
Рейтинг: 0 / 0
возможности switch()
    #39762945
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Попутал.
...
Рейтинг: 0 / 0
возможности switch()
    #39762946
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извини. Просто твой напористый стиль напомнил одного. Может чуть сбавишь обороты?

Мы тут все люди спокойные. Как в клубе.

OK?
...
Рейтинг: 0 / 0
возможности switch()
    #39762949
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Ну ладно, ладно. Дурачок было слишком прямолинейно. <<Отброс средних лет>>. Вот так в самый раз.
...
Рейтинг: 0 / 0
возможности switch()
    #39762991
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давай как зарубежных форумах. Сухо и по делу.

Я - добрый модератор. А другие - злые.
...
Рейтинг: 0 / 0
возможности switch()
    #39763037
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0Гирлионайльдо..коллектив. ..из за некомпетентности..

ну, судя по коду - писал его лох от сей.
1) использование констант в коде +1 шаг к увольнению.
2) если надо использовать скорость копирования, то откройте для себя стандартные функции библиотек (и как они решают эти дела. тут надо бы сказать про ту обезьяну которая не использует опыт человечества ранее накопленный) +10 шагов к увольнению , с записью в трудовую о не компетентности в данной области
3) время сколько затратит другой разработчик который заглянет в этот код? 5 секунд? 5 минут? Или 30 минут лазанья по компиляторам, с проверкой - а что хотел автор, правильно ли они превращают идею автора в результат, как это адаптировать к другим условиям которые пришли с выше... +5 шагов к увольнению организатора работ к допуску этого горе программиста к коду.
4) ... там ышо можно наковырять существенные минусы этого говнокода...

удачи вам, она вам потребуется
(круглый)

Этот человек, зашёл чисто что бы высказать своё больное мнение, которое ему навязали с целью его обидеть.

Он сам себе противоречит в 2 и 3 пункте, относительно первого. Потому что константы надо использовать активно и везде.
Пример WinApi - Curl и другое. Они используют константы для тонкой настройки какой нибудь прослойки.

Если человек будет писать значения константы А не константы, ибо у kolobok0 пальцы от остеохондроза давно рассыпались Может быть. То его точно уволят!

А может уже kolobok0 уволили, и он решил другим свой негативный опыт передать

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

... Он всего лишь Дилетант который пришёл на форум всем мозги морочить.

И не понятно кто его так обидел.
...
Рейтинг: 0 / 0
возможности switch()
    #39763039
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гирлионайльдо,

если кто-то некорректно высказался, то это не дает тебе право вести себя аналогично. Соблюдай правила форума. Не понравилось, напиши что не понравилось или нажми "Сообщить модератору".
...
Рейтинг: 0 / 0
возможности switch()
    #39763164
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Модератор: Закрыто
...
Рейтинг: 0 / 0
65 сообщений из 65, показаны все 3 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / возможности switch()
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]