Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Целочисленные типы в выражениях, Этот славный С++! 
:(
    Опции темы
Sleepless
Дата 28.3.2008, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 30.1.2008

Репутация: нет
Всего: нет



Цитата(Earnest @  27.3.2008,  19:08 Найти цитируемый пост)
Хотя, конечно, нынче компиляторы из  i%2 делают то же самое...

ИМХО, идеальный компилятор должен привести оба варианта к сдвигу вправо и анализу полученного бита... Кстати, VS 2005 для двух вариантов сгенерирует разный код, причем сдвига не будет ни в одном из них.
PM   Вверх
bsa
Дата 28.3.2008, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(Sleepless @ 28.3.2008,  11:25)
ИМХО, идеальный компилятор должен привести оба варианта к сдвигу вправо и анализу полученного бита...

Это откуда такая уверенность? Ты думаешь, скорость выполнения сдвига выше, чем у операции AND?
PM   Вверх
Sleepless
Дата 28.3.2008, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 30.1.2008

Репутация: нет
Всего: нет



Цитата(bsa @  28.3.2008,  13:57 Найти цитируемый пост)
Это откуда такая уверенность?

100% уверенности нет, т.к. обе операции регистровые. Только "И" требует 2 операнда... Ладно, пороюсь на досуге в Интеловской локументации
PM   Вверх
baldina
Дата 28.3.2008, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Sleepless, был удивлен, проверил. Все-таки оно одинаковый код генерит...
PM MAIL   Вверх
Sleepless
Дата 28.3.2008, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 30.1.2008

Репутация: нет
Всего: нет



Цитата(baldina @  28.3.2008,  14:19 Найти цитируемый пост)
Sleepless, был удивлен, проверил. Все-таки оно одинаковый код генерит... 

Ты про VS2005? Приведи С++ код, листинг и укажи настройки компилятора - сравню с моими
PM   Вверх
baldina
Дата 28.3.2008, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Если честно, на 2005 не проверял. Проверял на 2003 и 2008. Они генерят абсолютно одинаковый код. Потому думаю, что и 2005 не выделяется.
Код

  std::cout << (abc%2) << std::endl;
mov         eax,dword ptr [__imp_std::endl (40200Ch)] 
mov         ecx,dword ptr [abc (403018h)] 
and         ecx,1 
push        eax  
push        ecx  
mov         ecx,dword ptr [__imp_std::cout (402008h)] 
call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (402010h)] 
mov         ecx,eax 
call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (402014h)] 
  std::cout << (abc&1) << std::endl;
mov         edx,dword ptr [__imp_std::endl (40200Ch)] 
mov         eax,dword ptr [abc (403018h)] 
mov         ecx,dword ptr [__imp_std::cout (402008h)] 
push        edx  
and         eax,1 
push        eax  
call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (402010h)] 
mov         ecx,eax 
call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (402014h)] 


Добавлено через 3 минуты и 40 секунд
unsigned abc;

если тип знаковый, код, понятно, будет разным...
PM MAIL   Вверх
Sleepless
Дата 28.3.2008, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 30.1.2008

Репутация: нет
Всего: нет



Цитата(Sleepless @  28.3.2008,  11:25 Найти цитируемый пост)
Кстати, VS 2005 для двух вариантов сгенерирует разный код, причем сдвига не будет ни в одном из них. 

Цитата(baldina @  28.3.2008,  14:29 Найти цитируемый пост)
Они генерят абсолютно одинаковый код

Хм... Ты прав... Я ошибся :( Интересно, куда я смотрел? 

Может кто-нибудь привести код, сгенерированный не MS-компилятором?
PM   Вверх
korian
Дата 28.3.2008, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



Цитата(Sleepless @  28.3.2008,  13:54 Найти цитируемый пост)
Хм... Ты прав... Я ошибся :( Интересно, куда я смотрел? 

я вообще не понимаю о чем тут спорить...
тогда уж надо проверить все компиляторы, причем на каждом проверить все платформы (x86, x486... Core2Duo, потом AMD т.д.) и после этого можно будет только составить статистику, какой код генерится чаще.

PM   Вверх
Любитель
Дата 30.3.2008, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Я за энд smile


--------------------
PM MAIL ICQ Skype   Вверх
Mayk
Дата 30.3.2008, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(Sleepless @  28.3.2008,  18:54 Найти цитируемый пост)

Может кто-нибудь привести код, сгенерированный не MS-компилятором? 

Код

int imod2( int x ){
    return x  % 2;
}

int umod2( unsigned x ){
    return x  % 2;
}


gcc (GCC) 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2):
Код

imod2:
.LFB2:
    movl    %edi, %edx
    shrl    $31, %edx
    leal    (%rdi,%rdx), %eax
    andl    $1, %eax
    subl    %edx, %eax
    ret
.LFE2:
    .size    imod2, .-imod2
    .p2align 4,,15
.globl umod2
    .type    umod2, @function
umod2:
.LFB3:
    andl    $1, %edi
    movl    %edi, %eax
    ret



q3lcc. версию умалчивает. как он связан с ку3 не помню.
Код

imod2:
pushl %ebp
pushl %ebx
pushl %esi
pushl %edi
movl %esp,%ebp
movl 20(%ebp),%eax
movl $2,%ecx
cdq
idivl %ecx
movl %edx,%eax
.LC1:
movl %ebp,%esp
popl %edi
popl %esi
popl %ebx
popl %ebp
ret
.Lf2:
.size imod2,.Lf2-imod2
.globl umod2
.align 16
.type umod2,@function
umod2:
pushl %ebp
pushl %ebx
pushl %esi
pushl %edi
movl %esp,%ebp
movl 20(%ebp),%edi
andl $1,%edi
movl %edi,%eax
.LC3:
movl %ebp,%esp
popl %edi
popl %esi
popl %ebx
popl %ebp
ret


tcc: Information: Version: 4.0, Machine: linux-*-80x86, Release: TenDRA-4.1.2.
Код

imod2:
.set .Ldisp0, 0           
 movl 4+.Ldisp0(%esp),%eax
 andl $1,%eax
 ret
.align 4
.size imod2, .-imod2
.text
.type umod2,@function
.globl umod2
.align 16
umod2:
.set .Ldisp2, 0           
 movl 4+.Ldisp2(%esp),%eax
 andl $1,%eax
 ret


искать другие компиляторы в лом.


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Любитель
Дата 30.3.2008, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Код
movl 4+.Ldisp0(%esp),%eax andl $1,%eax

и
Код
movl 4+.Ldisp0(%esp),%eax andl $1,%eax

хде отличие? smile 




--------------------
PM MAIL ICQ Skype   Вверх
bsa
Дата 30.3.2008, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



ICC:
Код
umod2:
# parameter 1: %edi
..B1.1:                         # Preds ..B1.0
..___tag_value_umod2.1:                                         #5.24
        andl      $1, %edi                                      #6.14
        movl      %edi, %eax                                    #6.14
        ret                                                     #6.14
#........
imod2:
# parameter 1: %edi
..B2.1:                         # Preds ..B2.0
..___tag_value_imod2.9:                                         #1.19
        movl      %edi, %eax                                    #2.14
        andl      $-2147483647, %eax                            #2.14
        jge       ..B2.4        # Prob 50%                      #2.14
                                # LOE rbx rbp r12 r13 r14 r15 eax
..B2.5:                         # Preds ..B2.1
        decl      %eax                                          #2.14
        orl       $-2, %eax                                     #2.14
        incl      %eax                                          #2.14
                                # LOE rbx rbp r12 r13 r14 r15 eax
..B2.4:                         # Preds ..B2.1 ..B2.5
        ret                                                     #2.14

PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1453 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.