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

В каком случае проверка условия выполняется быстрее? - C++

Восстановить пароль Регистрация
 
Пёс
 Аватар для Пёс
228 / 76 / 4
Регистрация: 03.02.2013
Сообщений: 311
05.02.2013, 01:58     В каком случае проверка условия выполняется быстрее? #1
В каком случае проверка условия выполняется быстрее?
C++
1
while(1);
или
C++
1
while(true);
Ведь в одном из этих случаев должно происходить приведение типов, в каком именно?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,399
05.02.2013, 02:03     В каком случае проверка условия выполняется быстрее? #2
одно и то же
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
05.02.2013, 02:54     В каком случае проверка условия выполняется быстрее? #3
Цитата Сообщение от Пёс Посмотреть сообщение
Ведь в одном из этих случаев должно происходить приведение типов, в каком именно?
Если наличие-отсутствие приведения типов не меняет семантики кода, то компилятор волен мутить какие угодно оптимизации. Так как что int, что bool примитивные типы, для которых нельзя перегрузить оператор приведения, то здесь с вероятностью 99% сработает детектор бесконечных циклов и всё будет заменено на простой и эффективный jmp в конце без каких-либо приведений и, божеупаси, проверок.
Dr.Urban
63 / 58 / 7
Регистрация: 14.12.2011
Сообщений: 193
05.02.2013, 03:12     В каком случае проверка условия выполняется быстрее? #4
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Так как что int, что bool примитивные типы
true простой #define true 1

и что хуже кажется типа int.


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;
int main()
{
    bool i = true;
    int one = 1;
    int two = 2;
 
    if ( i == one)
    {
        cout << "Bool is define" << endl;
    }
    if ( i == two)
    {
        cout << "Bool is not define" << endl;
    }
    return 0;
 
}
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,399
05.02.2013, 03:19     В каком случае проверка условия выполняется быстрее? #5
Цитата Сообщение от Dr.Urban Посмотреть сообщение
true простой #define true 1
и что хуже кажется типа int.
так если #define, то уже не имеет типа данных, просто подстановка в код до компиляции программы.

Добавлено через 4 минуты
~OhMyGodSoLong~, так и есть.
1.10.24The implementation may assume that any thread will eventually do one of the following:
— terminate,
— make a call to a library I/O function,
— access or modify a volatile object, or
— perform a synchronization operation or an atomic operation.
[ Note: This is intended to allow compiler transformations such as removal of empty loops, even when
termination cannot be proven. —end note ]
Dr.Urban
63 / 58 / 7
Регистрация: 14.12.2011
Сообщений: 193
05.02.2013, 03:21     В каком случае проверка условия выполняется быстрее? #6
Цитата Сообщение от MrGluck Посмотреть сообщение
так если #define, то уже не имеет типа данных
Имел ввиду что оперируем 4-мя байтами, а не одним как бы это было логично. Даже 1 битом =))
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,399
05.02.2013, 03:24     В каком случае проверка условия выполняется быстрее? #7
Dr.Urban, с чего это 4?
Если вы думаете, что sizeof(int) == 4, так это неверно, т.к. по стандарту определен лишь sizeof(char) == 1, остальное зависит от реализации.
Да и почему это не может быть как char?
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
05.02.2013, 03:24     В каком случае проверка условия выполняется быстрее? #8
Цитата Сообщение от Dr.Urban Посмотреть сообщение
true простой #define true 1

и что хуже кажется типа int.
ну не int... обычно char, всё зависит от среды, в g++ sizeof(bool) возвращает 1 (int даёт 4)
и задан так, что если значение - 0, то ложь, во всех остальных случаях (1-255) - true
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,399
05.02.2013, 03:26     В каком случае проверка условия выполняется быстрее? #9
Цитата Сообщение от abit Посмотреть сообщение
(int бы дал 4)
Стандарт говорит так:
5.3.1. The sizeof operator yields the number of bytes in the object representation of its operand. The operand is
either an expression, which is an unevaluated operand (Clause 5), or a parenthesized type-id. The sizeof
operator shall not be applied to an expression that has function or incomplete type, to an enumeration
type whose underlying type is not fixed before all its enumerators have been declared, to the parenthesized
name of such types, or to an lvalue that designates a bit-field. sizeof(char), sizeof(signed char) and
sizeof(unsigned char) are 1. The result of sizeof applied to any other fundamental type (3.9.1) is
implementation-defined. [ Note: in particular, sizeof(bool), sizeof(char16_t), sizeof(char32_t), and
sizeof(wchar_t) are implementation-defined.73 —end note ] [ Note: See 1.7 for the definition of byte
and 3.9 for the definition of object representation. —end note ]
А у меня вот sizeof(int) = 8.
Dr.Urban
63 / 58 / 7
Регистрация: 14.12.2011
Сообщений: 193
05.02.2013, 03:28     В каком случае проверка условия выполняется быстрее? #10
Без разници 4 - не 4. Препроцессор подставляет в код число 1. Оно интерпретируется как (int)1. Потом уже приводите явно к чему хотите хоть char хоть ....

Да банальный cout << sizeof(1); скажет также ( Я не о стандарте и размере int)
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,399
05.02.2013, 03:36     В каком случае проверка условия выполняется быстрее? #11
Цитата Сообщение от Dr.Urban Посмотреть сообщение
Препроцессор подставляет в код число 1.
а я о чем
Dr.Urban, каков тип 1 в
C++
1
while(1);
Как вы это собрались определять?

Добавлено через 21 секунду
Цитата Сообщение от MrGluck Посмотреть сообщение
А у меня вот sizeof(int) = 8.
вру, 4 равен

Добавлено через 1 минуту
Dr.Urban, да и, тем более, не имеет значения все это т.к. while(1); компилятор просто выкинет, о чем писал ~OhMyGodSoLong~ и как я указал в цитате стандарта.
Dr.Urban
63 / 58 / 7
Регистрация: 14.12.2011
Сообщений: 193
05.02.2013, 03:42     В каком случае проверка условия выполняется быстрее? #12
Цитата Сообщение от MrGluck Посмотреть сообщение
Dr.Urban, каков тип 1 в
Код C++
1
while(1);
Тип int..К сожалению стандарт не процитирую, но более чем на 99% уверен.

Добавлено через 3 минуты
Сейчас что будет?

C++
1
2
3
4
5
6
7
8
9
10
volatile int i = 1;
    while(i)
    {
        
    }
    volatile bool b = true;
    while(b)
    {
        
    }
Пёс
 Аватар для Пёс
228 / 76 / 4
Регистрация: 03.02.2013
Сообщений: 311
05.02.2013, 03:42  [ТС]     В каком случае проверка условия выполняется быстрее? #13
Спасибо, ребят. Немного пополнил свои знания о структуре языка.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.02.2013, 03:59     В каком случае проверка условия выполняется быстрее?
Еще ссылки по теме:

C++ В каком случае данная программа выведет слово “Yes” ?
В каком случае данная программа выведет слово ДА C++
C++ Проверка условия в цикле for

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
05.02.2013, 03:59     В каком случае проверка условия выполняется быстрее? #14
че гадать. берем студию и смотрим дизасм. вот код:
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
#include <iostream>
#include <string>
 
int f(int i)
{
    std::cout << i << std::endl;
    return 10;
}
 
int main()
{
 
    int i = 0;
 
    while (1)
    {
        ++i;
        if (i > f(i))
        {
            i = 0;
            break;
        }
    }
 
    std::cout << "##############" << std::endl;
 
    while (true)
    {
        ++i;
        if (i > f(i))
        {
            i = 0;
            break;
        }
    }
 
    return 0;
}
В дебаге:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    while (1)
00411AC5  mov         eax,1 
00411ACA  test        eax,eax 
00411ACC  je          main+53h (411AF3h) 
    {
...
 
 
 
    while (true)
00411B1E  mov         eax,1 
00411B23  test        eax,eax 
00411B25  je          main+0ACh (411B4Ch) 
    {
....
Видно что в дебаге одно и то же. не удивительно.
Теперь в релизе:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    while (1)
    {
        ++i;
        if (i > f(i))
00401003  mov         eax,dword ptr [__imp_std::endl (402060h)] 
00401008  mov         ecx,dword ptr [__imp_std::cout (402054h)] 
0040100E  push        eax  
0040100F  add         esi,1 
00401012  push        esi  
00401013  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (402044h)] 
00401019  mov         ecx,eax 
0040101B  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (40203Ch)] 
00401021  cmp         esi,0Ah 
00401024  jle         main+3 (401003h)
для варианта с тру - то же самое. не силен в асме, но тут похоже вообще нет кода, выполняющего while(1),
что тоже логично. он и не особо нужен, компилятору и так понятно, что условия выхода из цилка где-то в
другом месте и тут нечего проверять.
Да и вообще такими мелочями не стоит заморачиваться. писать нужно логично и тру - тут более логичная
штука, потому как while ожидает что-то булевское.

Добавлено через 8 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
вот до кучи еще для for(;;) в дебаге:
 
    for (;;)
    {
        ++i;
00411617  mov         eax,dword ptr [i] 
0041161A  add         eax,1 
0041161D  mov         dword ptr [i],eax 
        if (i > f(i))
00411620  mov         eax,dword ptr [i] 
00411623  push        eax  
00411624  call        f (411154h) 
00411629  add         esp,4 
0041162C  cmp         dword ptr [i],eax 
0041162F  jle         main+0FAh (41163Ah) 
        {
так же как и для релизного while(true)
Yandex
Объявления
05.02.2013, 03:59     В каком случае проверка условия выполняется быстрее?
Ответ Создать тему
Опции темы

Текущее время: 01:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru