Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
 Аватар для Пёс
229 / 76 / 9
Регистрация: 03.02.2013
Сообщений: 311

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

05.02.2013, 01:58. Показов 1610. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В каком случае проверка условия выполняется быстрее?
C++
1
while(1);
или
C++
1
while(true);
Ведь в одном из этих случаев должно происходить приведение типов, в каком именно?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.02.2013, 01:58
Ответы с готовыми решениями:

Какая проверка выполняется быстрее (>, <, =, или <>)
Какая проверка выполняется быстрее (&gt;, &lt;, =, или &lt;&gt;) или по времени все одинаково?

Не выполняется проверка условия
Добрый день! Задача: Составить функцию inv (x, q, m), что возвращает x с инвертированными m битами, начиная с позиции q (остальные биты...

В каком случае необходимо применять StringBuilder, а в каком String?
Знаю, что уже есть подобные темы, но ответа в них не нашел. Да, String используется чаще, поэтому и спрашиваю - а когда я только начинаю...

13
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
05.02.2013, 02:03
одно и то же
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
05.02.2013, 02:54
Цитата Сообщение от Пёс Посмотреть сообщение
Ведь в одном из этих случаев должно происходить приведение типов, в каком именно?
Если наличие-отсутствие приведения типов не меняет семантики кода, то компилятор волен мутить какие угодно оптимизации. Так как что int, что bool примитивные типы, для которых нельзя перегрузить оператор приведения, то здесь с вероятностью 99% сработает детектор бесконечных циклов и всё будет заменено на простой и эффективный jmp в конце без каких-либо приведений и, божеупаси, проверок.
1
63 / 58 / 14
Регистрация: 14.12.2011
Сообщений: 193
05.02.2013, 03:12
Цитата Сообщение от ~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;
 
}
1
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
05.02.2013, 03:19
Цитата Сообщение от 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 ]
0
63 / 58 / 14
Регистрация: 14.12.2011
Сообщений: 193
05.02.2013, 03:21
Цитата Сообщение от MrGluck Посмотреть сообщение
так если #define, то уже не имеет типа данных
Имел ввиду что оперируем 4-мя байтами, а не одним как бы это было логично. Даже 1 битом =))
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
05.02.2013, 03:24
Dr.Urban, с чего это 4?
Если вы думаете, что sizeof(int) == 4, так это неверно, т.к. по стандарту определен лишь sizeof(char) == 1, остальное зависит от реализации.
Да и почему это не может быть как char?
0
 Аватар для abit
870 / 529 / 149
Регистрация: 03.02.2013
Сообщений: 1,847
05.02.2013, 03:24
Цитата Сообщение от Dr.Urban Посмотреть сообщение
true простой #define true 1

и что хуже кажется типа int.
ну не int... обычно char, всё зависит от среды, в g++ sizeof(bool) возвращает 1 (int даёт 4)
и задан так, что если значение - 0, то ложь, во всех остальных случаях (1-255) - true
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
05.02.2013, 03:26
Цитата Сообщение от 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.
0
63 / 58 / 14
Регистрация: 14.12.2011
Сообщений: 193
05.02.2013, 03:28
Без разници 4 - не 4. Препроцессор подставляет в код число 1. Оно интерпретируется как (int)1. Потом уже приводите явно к чему хотите хоть char хоть ....

Да банальный cout << sizeof(1); скажет также ( Я не о стандарте и размере int)
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
05.02.2013, 03:36
Цитата Сообщение от Dr.Urban Посмотреть сообщение
Препроцессор подставляет в код число 1.
а я о чем
Dr.Urban, каков тип 1 в
C++
1
while(1);
Как вы это собрались определять?

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

Добавлено через 1 минуту
Dr.Urban, да и, тем более, не имеет значения все это т.к. while(1); компилятор просто выкинет, о чем писал ~OhMyGodSoLong~ и как я указал в цитате стандарта.
0
63 / 58 / 14
Регистрация: 14.12.2011
Сообщений: 193
05.02.2013, 03:42
Цитата Сообщение от 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)
    {
        
    }
0
 Аватар для Пёс
229 / 76 / 9
Регистрация: 03.02.2013
Сообщений: 311
05.02.2013, 03:42  [ТС]
Спасибо, ребят. Немного пополнил свои знания о структуре языка.
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
05.02.2013, 03:59
че гадать. берем студию и смотрим дизасм. вот код:
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)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.02.2013, 03:59
Помогаю со студенческими работами здесь

Что выполняется быстрее?
Что выполняется быстрее (в первом случае идет вычисление адреса элемента массива, а во втором вычисляется сам элемент, причем известно что...

Что быстрее, проверка на null, или проверка на тип перечисления в запросе?
вопрос такой. если несколько таблиц. сходных по структуре в запросе. в первой таблице типТовара = перечисление.тратата.набор во...

Внутри проверки условия не производится ещё одна проверка условия
Как задумывалось - при нажатии на джойстик просто должны были остановится движки, но если при этом нажат джойстик по оси Y в опр...

В каком направлении в точке функция быстрее всего убывает?
Как решить задачу, в которой спрашивается, в каком направлении в точке функция быстрее всего убывает? Найти градиент в точке и -grad...

В каком случае оформляются доокументы
В каком случае оформляются доокументы: Платежное поручение входящее и Платежное поручение исходящее?


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru