Форум программистов, компьютерный форум CyberForum.ru

Возврат к началу switch - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Изменение размера созданного вектора http://www.cyberforum.ru/cpp-beginners/thread1164450.html
Как изменить размер вектора? Например, проводим какие-нибудь вычисления и результатов получилось больше, чем размер вектора. Как в таком случаи увеличить вектор?
C++ Проверить список запущенных процессов на наличие нужного Задача: 1. Все просто - проверить список запущенных процессов на наличие нужного мне процесса , если найден возвращаем правду если не найден выходим , ВНИМАНИЕ!!! функцию нужно вызывать постоянно , в потоке , в моём случае это таймер , так как .net приложение , но это не важно , если в обычной дллки в потоке вызывать - тоже самое. Код: BOOL CheckProcess(const char * procName) { HANDLE... http://www.cyberforum.ru/cpp-beginners/thread1164449.html
Sublime text 2 + MinGW не получается настроить C++
Все делал по теме: http://www.cyberforum.ru/blogs/390663/blog1982.html Или этот способ не подходит для Sublime text 2? Нажимаю Ctrl+B или Ctrl+Shift+B ничего не происходит, только появляется пустая консоль. Помогите, пожалуйста, настроить.
C++ Задать определенное число итераций
Здравствуйте! Сижу и пытаюсь разбираться с методами оптимизации, алгоритмы осилила, теперь новая проблема, мне метод необходимо "прогнать" определенное число раз и тот ответ, что получу вывести. Не могу понять как это сделать (как правильно поставить счетчик, чтоб процедура реализовывала именно то число итераций). Заранее спасибо!) double Dichotomy(double a, double b, bool flag) { double...
C++ Написать программу, которая считывает текст из файла и выводит на экран строки, содержащие двоичные числа http://www.cyberforum.ru/cpp-beginners/thread1164426.html
Помогите пожалуйста написать программу в CodeBlocks: Написать программу, которая считывает текст из файла и выводит на экран строки, содержащие двоичные числа. Буду очень благодарен!http://www.cyberforum.ru/images/editor/smilie.gif
C++ Как получить доступ к элементам вектора Нашел вот такой код. А вот как получить доступ к элементам вектора? FILE *ToWrite = fopen("C:\\result.txt", "w+"); list<string> ids; char s; while(true) { fgets(s, 20, f); ids.push_back(s); if(!feof(f))break; подробнее

Показать сообщение отдельно
DrOffset
6785 / 3996 / 917
Регистрация: 30.01.2014
Сообщений: 6,816
04.05.2014, 01:20     Возврат к началу switch
Цитата Сообщение от stawerfar Посмотреть сообщение
На всякий случай если вдруг не знали почитайте в стандарте языка значение оператора inline где вы прочтете что данная команда носит лишь рекомендательный характер в отличие от define. Эти топкости нужно знать. Или просто почаще смотреть понял ли вас компилятор при генерации кода асм
Если ты не понял о чем я говорю, это не значит, что я дурак
Во-первых inline в первом тесте не было вообще. Компилятор сам принял решение о встраивании.
Во-вторых, я пишу одно, а ты читаешь совершенно другое, сам придумываешь, потом сам же разоблачаешь -- нехорошо.
В третьих не надо отправлять меня в стандарт. Эта тема его мало касается. Т.к. мы говорим об оптимизации, а о ней там ни слова.
В четвертых в стандарт я и сам могу кого хочешь отправить

В общем, смотри еще раз:
Цитата Сообщение от DrOffset Посмотреть сообщение
при сохранении возможности "заинлайнить" accept, совершенно неважно что внутри него вызывается
Что тут не понятного?
Я где-то утверждал, что в случае невозможности встроить accept код будет другим?
Вот ты пишешь:
Цитата Сообщение от stawerfar Посмотреть сообщение
Попробуй в тело switch добавить пару функций да так что бы значения результатов было трудно прогназируемо
А я говорю, что добавление чего-то в тело switch не повлияет в целом на работу, если только мы не создадим условия, при которых невозможно будет встроить accept. Обеспечение эти условий - это отдельный разговор, и я даже не пытался его касаться.
Пример, я специально его не писал, потому что я знал что будет, а не потому что мне лень или еще что. Но раз ты так хочешь, то вот:
C++
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
extern "C" int foo1(); // эти функции определены в другой единице трансляции
extern "C" int foo2(); // поэтому компилятор НЕ может предположить что-то об их результате, как ты и хотел
 
extern "C" int test1()
{
    int x = 0;
    bool run = true;
 
    while(run)
    {
        run = false;
        std::cin >> x;
 
        switch(x)
        {
        case 1: run = foo1() != 2; break;
        case 2: run = foo2() != 1; break;
        case 3: break;
        default:
            run = true;
        }
    }
    return 0;
}
 
inline bool accept(int x)
{
    switch(x)
    {
    case 1:
        return foo1() != 2;
    case 2:
        return foo2() != 1;
    case 3:
        return true;
    default:
        return false;
    }
}
 
extern "C" int test2()
{
    int x = 0;
    while( std::cin >> x, !accept(x) );
    return 0;
}
 
int main()
{
}
Вот что получилось.
Это код БЕЗ функции. Цифрами пронумерованы прыжки.
Assembler
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
_test1:
    push    ebx
    sub esp, 40
    mov DWORD PTR [esp+28], 0
    lea ebx, [esp+28]
L14:
    mov DWORD PTR [esp], ebx
    mov ecx, OFFSET FLAT:__ZSt3cin
    call    __ZNSirsERi
    push    eax
    mov eax, DWORD PTR [esp+28]
    cmp eax, 2
    je  L6  ;#1
    cmp eax, 3
    je  L7  ;#2
    dec eax
    jne L14 ;#3
    call    _foo1
    cmp eax, 2
    setne   al
L8:
    test    al, al
    jne L14 ;#4
L7:
    xor eax, eax
    add esp, 40
    pop ebx
    ret
L6:
    call    _foo2
    dec eax
    setne   al
    jmp L8  ;#5
Вот код с функцией:
Assembler
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
_test2:
    push    ebx
    sub esp, 40
    mov DWORD PTR [esp+28], 0
    lea ebx, [esp+28]
L32:
    mov DWORD PTR [esp], ebx
    mov ecx, OFFSET FLAT:__ZSt3cin
    call    __ZNSirsERi
    push    edx
    mov eax, DWORD PTR [esp+28]
    cmp eax, 2
    je  L20 ;#1
    cmp eax, 3
    je  L21 ;#2
    dec eax
    jne L32 ;#3
    call    _foo1
    cmp eax, 2
    setne   al
L22:
    test    al, al
    je  L32 ;#4
L21:
    xor eax, eax
    add esp, 40
    pop ebx
    ret
L20:
    call    _foo2
    dec eax
    setne   al
    jmp L22 ;#5
Компилятор mingw 4.7.2. Опции -02, -save-temps, -masm=intel.
Я намеренно допустил мааленькое расхождение в двух примерах. В первом примере результат сравнения с foo1() и foo2() берется без инверсии, а во втором - с инверсией (помним про !accept() в цикле). Эта разница хорошо видна на метке #4. На этом различия (ну кроме имен меток, естественно) заканчиваются.
 
Текущее время: 08:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru