С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Изменение размера созданного вектора http://www.cyberforum.ru/cpp-beginners/thread1164450.html
Как изменить размер вектора? Например, проводим какие-нибудь вычисления и результатов получилось больше, чем размер вектора. Как в таком случаи увеличить вектор?
C++ Проверить список запущенных процессов на наличие нужного Задача: 1. Все просто - проверить список запущенных процессов на наличие нужного мне процесса , если найден возвращаем правду если не найден выходим , ВНИМАНИЕ!!! функцию нужно вызывать постоянно ,... 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++ Задать определенное число итераций
Здравствуйте! Сижу и пытаюсь разбираться с методами оптимизации, алгоритмы осилила, теперь новая проблема, мне метод необходимо "прогнать" определенное число раз и тот ответ, что получу вывести. Не...
C++ Написать программу, которая считывает текст из файла и выводит на экран строки, содержащие двоичные числа http://www.cyberforum.ru/cpp-beginners/thread1164426.html
Помогите пожалуйста написать программу в CodeBlocks: Написать программу, которая считывает текст из файла и выводит на экран строки, содержащие двоичные числа. Буду очень...
C++ Как получить доступ к элементам вектора Нашел вот такой код. А вот как получить доступ к элементам вектора? FILE *ToWrite = fopen("C:\\result.txt", "w+"); list<string> ids; char s; while(true) { fgets(s, 20,... подробнее

Показать сообщение отдельно
DrOffset
7377 / 4454 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
04.05.2014, 01:20
Цитата Сообщение от 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. На этом различия (ну кроме имен меток, естественно) заканчиваются.
2
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.