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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Что дороже - вызов ф-ии или условный оператор 
:(
    Опции темы
minyor
Дата 6.4.2010, 01:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Давно меня мучает вопрос. может и глупый немного smile
К примеру: (псевдокод)

Код

class File
{
    void *handle;

public:
    enum Source{FILE, ZIP};
    Source source;

public:
    __inline bool read(size_t size, ...)
    {
        switch(source)
        {
        case FILE: return ::fread(size, ... ) == size;
        case ZIP: return ::zread(size, ... ) == size;
        };

        return false;
    }

    bool open(const char filename)
    {
        if(::isZip(filename))
            source = ZIP;
        else
            source = FILE;

        ...

        return true;
    }

    ...
    ...
};


или так:

Код

class File
{
    void *handle;

public:
    typedef int (*Read)(int size, ...);
    Read readFunctor;

public:
    __inline bool read(size_t size, ...)
    {
        return readFunctor(size, ...) == size;
    }

    bool open(const char filename)
    {
        if(::isZip(filename))
            readFunctor = &::zread;
        else
            readFunctor = &::fread;

        ...

        return true;
    }

    ...
    ...
};


Может быть пример я выбрал и неочень удачный, может при чтении из потока это и не актуально. Но бывают разные ситуации, к примеру при написании движка к какой-нибудь игрухе, где нужно все оптимизировать, где динамически нужно выбрать как считать физику и т.п. Без использования ассемблерных вставок.

Хотел услышать ваше мнение, быстрее-ли будет такой выверт? .. может быть вариант где функтор вообще без параметров, на занесение которых в стек надо время. Или полюбому "if" или "switch" быстрее вызова ф-ии, даже если она без параметров и ничего не возвращает.
PM MAIL   Вверх
нуп
Дата 6.4.2010, 02:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ботокодер
**


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

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



inline же для switch не прокатит
PM MAIL   Вверх
minyor
Дата 6.4.2010, 02:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



хм, а че?, switch же просто должен будет вставиться вместо вызова ф-ии

Это сообщение отредактировал(а) minyor - 6.4.2010, 02:27
PM MAIL   Вверх
W4FhLF
Дата 6.4.2010, 04:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

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



У тебя же в обоих случаях идёт вызов функции. Просто в одном случае она будет вызвана косвенно (+1 обращение к памяти), а в другом напрямую. 

В данном случае вряд ли заинлайнится. Хотя, может я недооцениваю компилятор. smile 
Но switch он тоже разный бывает. Например, если твои константы FILE, ZIP идут подряд (0, 1, 2...), то переход в switch'e будет осуществляться через таблицу смещения без единого условного оператора, что в общем равносильно косвеному вызову через указатель на метод. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
borisbn
Дата 6.4.2010, 06:01 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



W4FhLF, покажите asm- код switch'а, который переходит по таблице смещения. Не свой, конечно, а сгенерённый компилятором. А если константы идут подряд, но так: 800, 801, 802 ... ?
minyor, Вы, конечно же, знаете, что преждевременная оптимизация - корень зла. Т.е. ваша программа уже выполняет все функции идеально правильно, а не хватает только производительности?
IMHO как теоретический вопрос - да, интересно, но нужно доверять компиляторам. Нередко они оптимизируют лучше, чем мы с вами, а читаемость кода - очень немаловажная вещь

Это сообщение отредактировал(а) borisbn - 6.4.2010, 06:03


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
minyor
Дата 6.4.2010, 06:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



W4FhLF - да правда, цена это +1 обращение к памяти. Но ведь еще вроде при условной операции конвеер прерывается. Вот интересно это преревание дороже наверное чем вызов адреса ф-ии без параметров. Но если там таблица смещения тогда ладно.

borisbn, да это у меня чисто теоритический интерес, хотя частенько, когда что-то писал бывало так и хотелось что-то подобное оформить, но как-раз удобочитабельность меня и останавливала smile.

Но если действительно быстрее то возможно в некоторых особо редких случаях удобочитабельностью можна будет и пожертвавать.

Если константы начинаются с 800, то компилятор мог-бы сделать подобное: int tblInd = val - 800; а потом уже обратится к табл. смещения. Но врядли он такое делает, если и делает то не каждый.

Это сообщение отредактировал(а) minyor - 6.4.2010, 06:56
PM MAIL   Вверх
borisbn
Дата 6.4.2010, 07:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(minyor @  6.4.2010,  06:26 Найти цитируемый пост)
едь вроде при условной операции конвеер прерывается

один конвеер - да. но у современных процессоров их до 128-ми (могу ошибаться с цифрой, но точно больше 16-ти). В одном конвеере выполняется код для true, в другом - для false, а когда наступает час X, просто переходится на нужный конвеер.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
W4FhLF
Дата 6.4.2010, 07:19 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

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



Цитата(minyor @  6.4.2010,  06:26 Найти цитируемый пост)
Но ведь еще вроде при условной операции конвеер прерывается. Вот интересно это преревание дороже наверное чем вызов адреса ф-ии без параметров. Но если там таблица смещения тогда ладно.


При вызове процедуры (операнд) конвеер вообще сбрасывается потому что начинает выполняться код, который расположен на другом участке памяти. А при условном переходе может и "угадать". Но как уже сказали, влияние данного вызова или mispredicting может быть несущественно. 

Цитата(borisbn @  6.4.2010,  06:01 Найти цитируемый пост)
W4FhLF, покажите asm- код switch'а, который переходит по таблице смещения. Не свой, конечно, а сгенерённый компилятором. А если константы идут подряд, но так: 800, 801, 802 ... ?


У вас компилятор работать перестал? Скомпилируйте и посмотрите. Я когда исследовал этот вопрос всё проверял, смотрел.



--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
GoldFinch
Дата 6.4.2010, 08:15 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



borisbn
для 800, 801, 802 компилятор вычтет 800 и сгенерит таблицу из 3х элементов,
для 800, 802, 803 компилятор вычтет 800 и сгенерит таблицу из 4х элементов, один из которых будет переходом на default

возьмите дизассемблер и посмотрите %)
алсо темы про switch не раз поднимались на форуме
PM MAIL ICQ   Вверх
GoldFinch
Дата 6.4.2010, 08:31 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



а для сильно разреженных констант, например 1, 8, 23, ... 211 компилятор сгенерит две таблицы:
первую для трансляции номера метки в порядковый номер перехода,
вторую для самих адресов перехода
PM MAIL ICQ   Вверх
minyor
Дата 6.4.2010, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



W4FhLFGoldFinch, Ну тогда можно спокойно юзать switch и не заморачиваться  smile 
Спасибо что прояснили, а то я про таблицу смещения неподумал. Switch это есть гуд!

Попробую сам поизучать asm-код, генерируемый gcc и vc ради интереса

borisbn - буду больше доверять компиляторам, спасибо  smile 
PM MAIL   Вверх
borisbn
Дата 6.4.2010, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



W4FhLFGoldFinch, про какой компилятор вы говорите? Я проверил на vc2008 (другого нет под рукой)
Код

int main( int argc, char *argv[] )
{
enum { E1, E2, E3 };
int x = ( argc > 2 ) ? E3 : E1;
switch ( x )
{
case E1: __asm mov ax, 0xFACE
    break;
case E2: __asm mov ax, 11
    break;
case E3: __asm mov ax, 14
    break;
}

даёт результат
Код

; 7    : enum { E1, E2, E3 };
; 8    : int x = ( argc > 2 ) ? E3 : E1;
  00024    33 c0         xor     eax, eax
  00026    83 7c 24 44 02     cmp     DWORD PTR _argc$[esp+60], 2
  0002b    0f 9e c0     setle     al
  0002e    48         dec     eax
  0002f    83 e0 02     and     eax, 2
; 9    : switch ( x )
  00032    83 e8 00     sub     eax, 0
  00035    74 16         je     SHORT $LN3@main
  00037    83 e8 01     sub     eax, 1
  0003a    74 0b         je     SHORT $LN2@main
  0003c    83 e8 01     sub     eax, 1
  0003f    75 10         jne     SHORT $LN4@main
; 15   : case E3: __asm mov ax, 14
  00041    66 b8 0e 00     mov     ax, 14            ; 0000000eH
; 16   :     break;
  00045    eb 0a         jmp     SHORT $LN4@main
$LN2@main:
; 12   :     break;
; 13   : case E2: __asm mov ax, 11
  00047    66 b8 0b 00     mov     ax, 11            ; 0000000bH
; 14   :     break;
  0004b    eb 04         jmp     SHORT $LN4@main
$LN3@main:
; 10   : {
; 11   : case E1: __asm mov ax, 0xFACE
  0004d    66 b8 ce fa     mov     ax, -1330        ; fffffaceH
$LN4@main:
; 17   : }

опции компилятора: /O2 /Ot и т.д.



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
W4FhLF
Дата 6.4.2010, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

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



borisbn, ну во-первых я не знаю с чего GoldFinch взял, что компилятор вообще всегда будет преобразовывать switch/case в таблицу. У меня такого не наблюдалось. 

Компилятор у меня VC++ 2008.

C++:
Код

     int a;
     std::cin >> a;
     switch (a)
     {
     case 1:
          std::cout << 1;
          break;
     case 2:
          std::cout << 2;
          break;
     case 3:
          std::cout << 3;
          break;
     case 4:
          std::cout << 4;
          break;
     }


asm:

Код

     int a;
     std::cin >> a;
00404097  mov         ecx,dword ptr [__imp_std::cin (407074h)] 
0040409D  lea         eax,[esp+0Ch] 
004040A1  push        eax  
004040A2  call        dword ptr [__imp_std::basic_istream<char,std::char_traits<char> >::operator>> (40707Ch)] 

     switch (a)
004040A8  mov         eax,dword ptr [esp+0Ch] 
004040AC  dec         eax  
004040AD  cmp         eax,3 
004040B0  ja          $LN1+0Eh (4040D3h) 
004040B2  jmp         dword ptr  (404130h)[eax*4] 
     {
     case 1:
          std::cout << 1;
004040B9  push        1    
          break;
004040BB  jmp         $LN1+2 (4040C7h) 
     case 2:
          std::cout << 2;
004040BD  push        2    
          break;
004040BF  jmp         $LN1+2 (4040C7h) 
     case 3:
          std::cout << 3;
004040C1  push        3    
          break;
004040C3  jmp         $LN1+2 (4040C7h) 
     case 4:
          std::cout << 4;
004040C5  push        4    
004040C7  mov         ecx,dword ptr [__imp_std::cout (407078h)] 
004040CD  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (407080h)] 
          break;
     }


Смещение считается по таблице. 

А вот пример с if/else:
Код

     int a;
     std::cin >> a;
     if(a == 1)
          std::cout << 1;
     else if(a == 2)
          std::cout << 2;
     else if(a == 3)
          std::cout << 3;
     else if(a == 4)
          std::cout << 4;


asm:
 
Код

    int a;
     std::cin >> a;
00404097  mov         ecx,dword ptr [__imp_std::cin (407074h)] 
0040409D  lea         eax,[esp+0Ch] 
004040A1  push        eax  
004040A2  call        dword ptr [__imp_std::basic_istream<char,std::char_traits<char> >::operator>> (40707Ch)] 

     if(a == 1)
004040A8  mov         eax,dword ptr [esp+0Ch] 
004040AC  cmp         eax,1 
004040AF  jne         main+0B4h (4040B4h) 
          std::cout << 1;
004040B1  push        eax  
004040B2  jmp         main+0CAh (4040CAh) 
     else if(a == 2)
004040B4  cmp         eax,2 
004040B7  jne         main+0BCh (4040BCh) 
          std::cout << 2;
004040B9  push        eax  
004040BA  jmp         main+0CAh (4040CAh) 
     else if(a == 3)
004040BC  cmp         eax,3 
004040BF  jne         main+0C4h (4040C4h) 
          std::cout << 3;
004040C1  push        eax  
004040C2  jmp         main+0CAh (4040CAh) 
     else if(a == 4)
004040C4  cmp         eax,4 
004040C7  jne         main+0D6h (4040D6h) 
          std::cout << 4;
004040C9  push        eax  
004040CA  mov         ecx,dword ptr [__imp_std::cout (407078h)] 
004040D0  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (407080h)]


Никакой таблицы ессно нет. Всё на основе кучи cmp/jx.

На такие случаи будет генерится таблица:

Код

int main()
{
    int a = 0;
    std::cin >> a;
    switch( a )
    {
    case 0:
        std::cout << 0;
        break;
    case 1:
        std::cout << 10;
        break;
    case 2:
        std::cout << 20;
        break;
    case 3:
        std::cout << 30;
        break;
    }
}


Код

    int a = 0;
    std::cin >> a;
    switch( a )
    {
//    case 0:
//        std::cout << 0;
//        break;
    case 1:
        std::cout << 10;
        break;
    case 2:
        std::cout << 20;
        break;
    case 3:
        std::cout << 30;
        break;
    case -1:
        std::cout << -1;
        break;
    case 20:
        std::cout << 200;
        break;
    }


Код

    int a = 0;
    std::cin >> a;
    switch( a )
    {
//    case 0:
//        std::cout << 0;
//        break;
    case 10:
        std::cout << 10;
        break;
    case 20:
        std::cout << 20;
        break;
    case 30:
        std::cout << 30;
        break;
    case -10:
        std::cout << -1;
        break;
    case 60:
        std::cout << 200;
        break;
    }


Если в последнем примере 60 на 600 заменить для него будет генериться отдельное сравнение. 

А на такой будут генерится сравнения:
Код

    switch( a )
    {
//    case 0:
//        std::cout << 0;
//        break;
    case 100:
        std::cout << 10;
        break;
    case 200:
        std::cout << 20;
        break;
    case 300:
        std::cout << 30;
        break;
    case -100:
        std::cout << -1;
        break;
    case 600:
        std::cout << 200;
        break;
    }


В общем компилер умный. И единого правила у него нет. Скорее всего какое-то комплексное решение принимается.

Добавлено @ 13:16
Мы это с zkv проверяли. smile

Это сообщение отредактировал(а) W4FhLF - 6.4.2010, 13:18


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
GoldFinch
Дата 6.4.2010, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



я это взял из практики реверсирования программ, в том числе написанных на С++
разумеется компилятор выбирает из всех вариантов тот который кажется ему более оптимальным %)
PM MAIL ICQ   Вверх
GoldFinch
Дата 6.4.2010, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



однако, это воспроизводится на раз.

для разреженных значений меток:
Код

#include <intrin.h> // для __rdtsc

#pragma comment(linker,"/entry:main") // уменьшаем размер файла

void main()
{
    int x = __rdtsc() & 0xFF; // берем 8 случайных бит
    switch(x + 800)
    {
    default:  __asm{mov eax, 0}; break;
    case 801: __asm{mov eax, 1}; break;
    case 812: __asm{mov eax, 2}; break;
    case 813: __asm{mov eax, 3}; break;
    case 854: __asm{mov eax, 4}; break;
    case 855: __asm{mov eax, 5}; break;
    case 876: __asm{mov eax, 6}; break;
    case 897: __asm{mov eax, 7}; break;
    case 928: __asm{mov eax, 8}; break;
    case 999: __asm{mov eax, 9}; break;
    }
}


(в листинге который выводит компилятор написан явный бред, по этому привожу листинг IDA
Код

.text:00401000 ; int __cdecl main()
.text:00401000                 public _main
.text:00401000 _main           proc near
.text:00401000                 rdtsc
.text:00401002                 and     eax, 0FFh
.text:00401007                 dec     eax
.text:00401008                 cmp     eax, 198        ; switch 199 cases
.text:0040100D                 ja      short loc_401053 ; default
.text:0040100D                                         ; jumptable 00401016 cases 1-10,13-52,55-74,76-95,97-126,128-197
.text:0040100F                 movzx   eax, byte ptr ds:jumpIdxTable[eax]
.text:00401016                 jmp     dword ptr ds:jumpAddrTable[eax*4] ; switch jump
.text:0040101D
.text:0040101D $LN9:                                   ; DATA XREF: _main:jumpAddrTableo
.text:0040101D                 mov     eax, 1          ; jumptable 00401016 case 0
.text:00401022                 retn
.text:00401023 ; ---------------------------------------------------------------------------
.text:00401023
.text:00401023 $LN8:                                   ; CODE XREF: _main+16j
.text:00401023                                         ; DATA XREF: _main:jumpAddrTableo
.text:00401023                 mov     eax, 2          ; jumptable 00401016 case 11
.text:00401028                 retn
.text:00401029 ; ---------------------------------------------------------------------------
.text:00401029
.text:00401029 $LN7:                                   ; CODE XREF: _main+16j
.text:00401029                                         ; DATA XREF: _main:jumpAddrTableo
.text:00401029                 mov     eax, 3          ; jumptable 00401016 case 12
.text:0040102E                 retn
.text:0040102F ; ---------------------------------------------------------------------------
.text:0040102F
.text:0040102F $LN6:                                   ; CODE XREF: _main+16j
.text:0040102F                                         ; DATA XREF: _main:jumpAddrTableo
.text:0040102F                 mov     eax, 4          ; jumptable 00401016 case 53
.text:00401034                 retn
.text:00401035 ; ---------------------------------------------------------------------------
.text:00401035
.text:00401035 $LN5:                                   ; CODE XREF: _main+16j
.text:00401035                                         ; DATA XREF: _main:jumpAddrTableo
.text:00401035                 mov     eax, 5          ; jumptable 00401016 case 54
.text:0040103A                 retn
.text:0040103B ; ---------------------------------------------------------------------------
.text:0040103B
.text:0040103B $LN4:                                   ; CODE XREF: _main+16j
.text:0040103B                                         ; DATA XREF: _main:jumpAddrTableo
.text:0040103B                 mov     eax, 6          ; jumptable 00401016 case 75
.text:00401040                 retn
.text:00401041 ; ---------------------------------------------------------------------------
.text:00401041
.text:00401041 $LN3:                                   ; CODE XREF: _main+16j
.text:00401041                                         ; DATA XREF: _main:jumpAddrTableo
.text:00401041                 mov     eax, 7          ; jumptable 00401016 case 96
.text:00401046                 retn
.text:00401047 ; ---------------------------------------------------------------------------
.text:00401047
.text:00401047 $LN2:                                   ; CODE XREF: _main+16j
.text:00401047                                         ; DATA XREF: _main:jumpAddrTableo
.text:00401047                 mov     eax, 8          ; jumptable 00401016 case 127
.text:0040104C                 retn
.text:0040104D ; ---------------------------------------------------------------------------
.text:0040104D
.text:0040104D $LN1:                                   ; CODE XREF: _main+16j
.text:0040104D                                         ; DATA XREF: _main:jumpAddrTableo
.text:0040104D                 mov     eax, 9          ; jumptable 00401016 case 198
.text:00401052                 retn
.text:00401053 ; ---------------------------------------------------------------------------
.text:00401053
.text:00401053 loc_401053:                             ; CODE XREF: _main+Dj
.text:00401053                                         ; _main+16j
.text:00401053                                         ; DATA XREF: ...
.text:00401053                 mov     eax, 0          ; default
.text:00401053                                         ; jumptable 00401016 cases 1-10,13-52,55-74,76-95,97-126,128-197
.text:00401058                 retn
.text:00401058 ; ---------------------------------------------------------------------------
.text:00401059                 align 4
.text:0040105C jumpAddrTable:                          ; DATA XREF: _main+16r
.text:0040105C                 dd offset $LN9, offset $LN8, offset $LN7, offset $LN6 ; jump table for switch statement
.text:0040105C                 dd offset $LN5, offset $LN4, offset $LN3, offset $LN2
.text:0040105C                 dd offset $LN1, offset loc_401053
.text:00401084 jumpIdxTable:                           ; DATA XREF: _main+Fr
.text:00401084                 db      0,     9,     9,     9,     9,     9,     9,     9 ; indirect table for switch statement
.text:00401084                 db      9,     9,     9,     1,     2,     9,     9,     9
.text:00401084                 db      9,     9,     9,     9,     9,     9,     9,     9
.text:00401084                 db      9,     9,     9,     9,     9,     9,     9,     9
.text:00401084                 db      9,     9,     9,     9,     9,     9,     9,     9
.text:00401084                 db      9,     9,     9,     9,     9,     9,     9,     9
.text:00401084                 db      9,     9,     9,     9,     9,     3,     4,     9
.text:00401084                 db      9,     9,     9,     9,     9,     9,     9,     9
.text:00401084                 db      9,     9,     9,     9,     9,     9,     9,     9
.text:00401084                 db      9,     9,     9,     5,     9,     9,     9,     9
.text:00401084                 db      9,     9,     9,     9,     9,     9,     9,     9
.text:00401084                 db      9,     9,     9,     9,     9,     9,     9,     9
.text:00401084                 db      6,     9,     9,     9,     9,     9,     9,     9
.text:00401084                 db      9,     9,     9,     9,     9,     9,     9,     9
.text:00401084                 db      9,     9,     9,     9,     9,     9,     9,     9
.text:00401084                 db      9,     9,     9,     9,     9,     9,     9,     7
.text:00401084                 db      9,     9,     9,     9,     9,     9,     9,     9
.text:00401084                 db      9,     9,     9,     9,     9,     9,     9,     9
.text:00401084                 db      9,     9,     9,     9,     9,     9,     9,     9
.text:00401084                 db      9,     9,     9,     9,     9,     9,     9,     9
.text:00401084                 db      9,     9,     9,     9,     9,     9,     9,     9
.text:00401084                 db      9,     9,     9,     9,     9,     9,     9,     9
.text:00401084                 db      9,     9,     9,     9,     9,     9,     9,     9
.text:00401084                 db      9,     9,     9,     9,     9,     9,     9,     9
.text:00401084                 db      9,     9,     9,     9,     9,     9,     8
.text:00401084 _main           endp


jumpIdxTable - таблица трансляции значений меток в индекс таблицы переходов
jumpAddrTable - таблица адресов переходов

опции компилятора
Код

/O2 /Oi /GL /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /FD /EHsc /MT /Gy /FAcs /Fa"Release\\" /Fo"Release\\" /Fd"Release\vc90.pdb" /W3 /nologo /c /Zi /TP /errorReport:prompt


Это сообщение отредактировал(а) GoldFinch - 6.4.2010, 13:51
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1209 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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