![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| SaDFromSpb |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 5.4.2006 Где: Санкт-Петербург Репутация: 3 Всего: 3 |
В орейлевском справочнике по С++ (по стандарту iso/iec 14882) написано, что выражение типа bool может быть продвинуто к целому типу: false станет нулем, а true - единицей. Значит ли это, что эти логические значения представлены в памяти как 00000000 и как 00000001 соответственно? То есть, могу ли я использовать оператор ^, как "исключающее или" в логических выражениях?
Ну, к примеру, определение, лежит ли точка x между xA и xB (при условии xA < xB = ?):
Пытался найти информацию по этому поводу в черновике стандарта, по ссылочке здесь вверху, но что-то не нашел. Не мог найти в содержании информацию о представлении типов в памяти, а поиска в моем просмотрщике пдф нету -------------------- "За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001) |
|||
|
||||
| Daevaorn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
это как? так ты вначале приведи, а уже потом применяй ^ ISO/IEC 14882 Second edition 2003-10-15
|
||||
|
|||||
| MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
это не точно, но, имхо + gcc, bool в памяти - байт; false - 0; true - 1
Это сообщение отредактировал(а) MAKCim - 14.1.2007, 16:46 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
| SaDFromSpb |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 5.4.2006 Где: Санкт-Петербург Репутация: 3 Всего: 3 |
Ну всмысле продвижение типов автоматическое.... Ты о чем? Слева и справа результаты операций, которые bool возвращают... Ну вот и здорово! Всем спасибо. Это сообщение отредактировал(а) SaDFromSpb - 14.1.2007, 18:14 -------------------- "За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001) |
|||
|
||||
| Vyacheslav |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
Любопытно, а почему просто нельзя
Или это, чтобы враги не догадались -------------------- С уважением, Вячеслав Ермолаев |
||||||
|
|||||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
| SaDFromSpb |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 5.4.2006 Где: Санкт-Петербург Репутация: 3 Всего: 3 |
Vyacheslav, во-первых, я же написал, что мы не знаем, XА больше XB или наоборот, следовательно прийдется писать так:
или так:
В этих случаях будет очевидно больше операций, чем в моем случае (две операции сравнения и одна логическая побитовая). Это будет использоваться в коде, который будет отрабатываться сотни миллионов раз (без преувиличения) при обработке графических данных. Убедительно? Это сообщение отредактировал(а) SaDFromSpb - 15.1.2007, 18:11 -------------------- "За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001) |
||||
|
|||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Хм... Либо я напился...
if ( (x > xA) || (x > xB)) ... Но точно можно попроще решить |
|||
|
||||
| SaDFromSpb |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 5.4.2006 Где: Санкт-Петербург Репутация: 3 Всего: 3 |
А верхняя граница? Ну давай. (Кстати твое решение по вычислительной нагрузке такое же (если забыть, что оно неверно))Куда уж проще? Две точки - два сравнения, одна операция ^. Она для тебя сложна? MAKCim, а что даст приведение к unsigned char? Оно по стандарту к единице приведется? Не будет ли это приведение считаться как операция, если булевский результат представлен не единицей? Хотя приведение - в любом случае дополнительная операция. Вычислительная нагрузка увеличится. Это сообщение отредактировал(а) SaDFromSpb - 15.1.2007, 21:05 -------------------- "За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001) |
|||
|
||||
| UnrealMan |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
На самом деле представление тут не имеет никакого значения, поскольку продвижение происходит неявно (и не важно, что операция именно побитовая), т.е. в данном случае операнды типа bool оператора ^ сначала неявно приводятся к int, а затем уже происходит вычисление.
В свою очередь, как уже заметили ранее, продвижение bool к int обязано быть реализовано таким образом, чтобы false обращалось в ноль, а true – в единицу, независимо от представления bool. |
||||
|
|||||
| SaDFromSpb |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 5.4.2006 Где: Санкт-Петербург Репутация: 3 Всего: 3 |
UnrealMan, а можно ссылку на ISO/IEC 14882:2003?
Получается, в этой операции присутствуют еще два приведения к интам с выделением памяти под них Будем надеятся, что это оптимизируется как-нибудь. Это сообщение отредактировал(а) SaDFromSpb - 16.1.2007, 12:24 -------------------- "За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001) |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
не переживай, никаких выделений не будет http://www.open-std.org/jtc1/sc22/wg21/ |
|||
|
||||
| UnrealMan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Только что привёл (4-й случай, выделенный пурпурным цветом. Там же есть номер пункта, где описываются продвижения). |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Ради развлечения сделал 2 цикла по 6 миллионов проходов.
1-й вариант if ((i>Ax)^(i<Bx)) j=0; 2-й вариант if ((i>Ax)&&(i<Bx)) j=0; 1-й вариант работал 2 минуты 17 секунд 2-й вариант 2 минуты 16 секунд Так что к вопросу об экономии вычислительной мощности... В ассемблерный код не лез - просто развлекаюсь |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |